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。動作ティックはタイマーと同じスレッドで動作すると思い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;
        }
    }
}
4

2 に答える 2

3

を使用しているようですSystem.Threading.Timer。その場合、tickメソッドはプールスレッドで実行されます。間違いなく、アプリケーションのメインスレッドではありません。

参考までに、WindowsフォームタイマーはGUIスレッドで経過イベントを実行します。

のデフォルトの動作は、プールスレッドでイベントSystem.Timers.Timerを実行することです。Elapsedただし、SynchronizingObjectWindowsフォームコンポーネントを参照するようにを設定すると、イベントはGUIスレッドにマーシャリングされます。

于 2013-03-27T14:48:05.107 に答える
0

http://msdn.microsoft.com/en-us/library/system.threading.timer.aspxから

「このメソッドは、タイマーを作成したスレッドでは実行されません。システムによって提供されるThreadPoolスレッドで実行されます。」

于 2013-03-27T14:54:56.870 に答える