2013-03-27 4 views
0

Мне нужен класс, который может выполнять задание по времени в потоке отдельно от его родителя, но я немного запутался в том, к какому потоку принадлежат разные части, любая информация будет оценена.Какой поток выполняет методы?

Моя цель состоит в том, чтобы выполнить задание с временным управлением независимо от родительского элемента, так как будет более одного из них, контролируемого родительским объектом-оболочкой.

Это то, что я придумал:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 

public class timed_load_process { 
    private object _lock; 
    protected string process; 
    protected Timer timer; 
    protected bool _abort; 
    protected Thread t; 

    protected bool aborting { get { lock (_lock) { return this._abort; } } } 

    public timed_load_process(string process) { 
     this._abort = false; 
     this.process = process; 
     this.t = new Thread(new ThreadStart(this.threaded)); 
     this.t.Start(); 
    } 

    protected void threaded() { 
     this.timer = new Timer(new TimerCallback(this.tick), false, 0, 1000); 
     while (!this.aborting) { 
      // do other stuff 
      Thread.Sleep(100); 
     } 
     this.timer.Dispose(); 
    } 

    protected void tick(object o) { 
     // do stuff 
    } 

    public void abort() { lock (_lock) { this._abort = true; } } 
} 

Так как таймер был экземпляр в потоке, это работать в потоке t или внутри резьбы timed_load_process, и я полагаю, что операция tick будет работать в том же потоке, что и таймер t.

Окончание с:

public class timed_load_process : IDisposable { 
    private object _lock; 
    private bool _tick; 
    protected string process; 
    protected Timer timer; 
    protected bool _abort; 

    public bool abort { 
     get { lock (_lock) { return this._abort; } } 
     set { lock (_lock) { this.abort = value; } } 
    } 

    public timed_load_process(string process) { 
     this._abort = false; 
     this.process = process; 
     this.timer = new Timer(new TimerCallback(this.tick), false, 0, 1000); 
    } 

    public void Dispose() { 
     while (this._tick) { Thread.Sleep(100); } 
     this.timer.Dispose(); 
    } 

    protected void tick(object o) { 
     if (!this._tick) { 
      this._tick = true; 
      // do stuff 
      this._tick = false; 
     } 
    } 
} 
+0

В отличие от сайтов на форуме, мы не используем «Спасибо» или «Любая помощь оценена» или подписи на [so]. См. «[Должны ли« Привет »,« спасибо », теги и приветствия удалены из сообщений?] (Http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be –

+0

Какой вид таймера - нет пространств имен? –

+0

Я вставил надписи над текстом, я сделал это таймер System.Threading. – marts

ответ

3

Похоже, вы используете System.Threading.Timer. Если это так, то метод tick работает в потоке пула. Это, безусловно, не основная тема приложения.

Для вашей информации таймер Windows Forms выполняет истекшее событие в потоке графического интерфейса пользователя.

Поведение по умолчанию для System.Timers.Timer - это выполнить событие Elapsed в пуле. Однако, если вы установите для SynchronizingObject ссылку на компонент Windows Forms, событие будет привязано к потоку графического интерфейса.

+0

Так что это означало бы, что я мог бы устранить потоки часть процесса целиком и блокировка тоже (если тик не получает доступ к полям, к которым можно получить доступ извне). Давая таймеру запустить операцию тика без специальной настройки потока. Это очень упростило бы код :) – marts

+1

Кроме того, нет необходимости создавать таймер в новом потоке. Также лучше использовать ManualResetEvent для блокировки до прерванного. Наконец, лучше реализовать интерфейс IDisposable и вызвать timer.Dispose в своем методе Dispose. –

+0

Основываясь на этих комментариях, я думаю, что это конец игры: ... добавляя к основному вопросу, так как слишком долго! – marts

Смежные вопросы