0

ループの進行状況を計算しているforループ(独自のスレッドで実行)があり、ループが変更されるたびに進行状況の値を表示したいのですが、ループの外でメッセージ表示コマンドを実行したいので、ループは実行されません。 tループを一時停止します。

ビジーループ中に進行状況を表示するにはどうすればよいですか?を読みました。、しかし、ループを開始するクラスのインスタンスを使用するものがすでにあるため、バックグラウンドワーカーを使用したくありません(つまり、バックグラウンドワーカーをネストしたくない)。代替案はイベントを発生させて聞くことだと思いますが、この場合、それをどのように実装するかはわかりません。

では、バックグラウンドワーカーを使用せずにこの問題を解決するにはどうすればよいですか?

4

3 に答える 3

1

Winformsの場合MyForm.BeginInvoke()は、進行状況の表示を更新する匿名のデリゲートを使用するだけで済みます。BeginInvoke非同期であるため、現在のスレッドをブロックしません。

于 2012-09-03T10:14:20.537 に答える
0

LoopWatcherのようなものをループスレッドから外すように通知する必要があります。

public class ProgressEventArgs : EventArgs
{
    public int Number { get; private set; }
    public ProgressEventArgs(int num)
    {
        this.Number = num;
    }
}

public class Worker
{
    public event EventHandler<ProgressEventArgs> ProgressChanged = delegate { };

    public void DoSomething()
    {
        for (int i = 0; i < 10; i++)
        {
            ProgressChanged(this, new ProgressEventArgs(i));
            Thread.Sleep(1000);   //just an example here
        }
    }
}

でわかるようにWorker.DoSomething、時間がかかるループがあります。にイベントを追加したWorkerので、クラスの外で、サブスクライバーは進行状況が変更されたことを知ることができます。

var worker = new Worker();
worker.ProgressChanged += (s, e) => Console.WriteLine(e.Number);
Thread t = new Thread(worker.DoSomething);
t.Start();
于 2012-09-03T10:15:56.403 に答える
0

提供された回答が私の要件を満たしていないため、私はイベントについていくつかの調査を行い、当初の方法で問題を解決しました。

ループを開始しているクラスでイベントを宣言しました。

public delegate void ProgressChangedEvHandler(int progress);

public event ProgressChangedEvHandler ProgressChanged;

private void OnProgressChanged(int progress)
{
    var handler = ProgressChanged;
    if (handler != null) handler(progress);
}

次に、ループ内からイベントを呼び出しました。

for (var index = 0; index < arrayListCount; index++)
{
    var progress = (int) (100*(double) index/(double) arrayListCount);
    OnProgressChanged(progress);
}

LoopClassInstance.ProgressChanged += LoopClassInstance_ProgressChanged;次に、別のクラス(別のスレッド)にリスナー()を作成しました。

private void LoopClassInstance_ProgressChanged(int progress)
{
    toolStripProgressBar1.Value = progress;
}
于 2012-09-03T13:34:31.413 に答える