1

現在、doWorkが以下のような関数を呼び出すバックグラウンドスレッドがあります。

private void ThreadForAnalyzingReqFile_DoWork(object sender, DoWorkEventArgs e) 
{
    AnotherClass.AVeryLongTimedFunction();
}

ここで、コードは、AnotherClassのAVeryLongTimedFunction()が終了するまで待機しますこれには約1〜2分かかる場合があります)。これが発生している間、何が発生しているかを正確に知るにはどうすればよいですか?(別のクラスの)関数が終了したことを通知する方法はありますか?

このスレッドは、WPFのMainWindowクラスにあります。VisualStudio2010を使用しています。

4

3 に答える 3

0

コールバック関数を「VeryLongTimedFunction」に渡して、50個のアイテムが処理されるたび、20回の反復が行われるたびなど、何らかの「進行」イベントが発生するたびに呼び出すようにしてください。

于 2012-09-05T12:50:49.487 に答える
0

これを行うには多くの方法があります。2つの簡単なオプション:

(1)などのUIクラスでイベントを作成し、UpdateProgress意味のある間隔でそのイベントを通知します

例:

    private void ThreadForAnalyzingReqFile_DoWork(object sender, DoWorkEventArgs e)
    {
        AnotherClass processor = new AnotherClass();
        processor.ProgressUpdate += new AnotherClass.ReallyLongProcessProgressHandler(this.Processor_ProgressUpdate);
        processor.AVeryLongTimedFunction();
    }

    private void Processor_ProgressUpdate(double percentComplete)
    {

        this.progressBar1.Invoke(new Action(delegate()
        {
            this.progressBar1.Value = (int)(100d*percentComplete); // Do all the ui thread updates here
        }));
    }

そして「AnotherClass」で

public partial class AnotherClass
{
    public delegate void ReallyLongProcessProgressHandler(double percentComplete);

    public event ReallyLongProcessProgressHandler ProgressUpdate;

    private void UpdateProgress(double percent)
    {
        if (this.ProgressUpdate != null)
        {
            this.ProgressUpdate(percent);
        }
    }

    public void AVeryLongTimedFunction()
    {
        //Do something AWESOME
        List<Item> items = GetItemsToProcessFromSomewhere();
        for (int i = 0; i < items.Count; i++)
        {
            if (i % 50)
            {
               this.UpdateProgress(((double)i) / ((double)items.Count)
            }
            //Process item
        }
    }
}

(2)に進捗率フィールドを作成しますAnotherClass。時折、タイマーのUIでこれを問い合わせます。

于 2012-09-05T12:51:03.040 に答える
0

他の人が示唆しているように、それを達成する方法は複数ありますが、最も簡単なBackgroundWorkerのはスレッドの代わりに使用することです。

進行状況を示すには、プロパティをtrueに設定WorkerSupportsCancellationしてから、呼び出しworker.ReportProgress(percentage complete)て進行状況を示します。完了通知の場合は、イベント通知を使用します。

worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(method_run_on_complete);
private void method_run_on_complete(object sender, DoWorkEventArgs e) { ... }

詳細については、以下を参照してください。

http://www.dreamincode.net/forums/topic/112547-using-the-backgroundworker-in-c%23/

http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/28774446-144d-4716-bd1c-46f4bb26e016

于 2012-09-05T13:02:54.237 に答える