1

目前我有一个后台线程,其 doWork 调用类似于下面的函数。

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

现在,代码将等到AnotherClass中的AVeryLongTimedFunction ()完成(这可能需要大约 1-2 分钟)虽然发生这种情况,但我怎么知道到底发生了什么?有什么方法可以通知我函数(在另一个类中)完成?

这个线程在我的 WPF 的 MainWindow 类中。我正在使用 Visual Studio 2010。

4

3 回答 3

0

尝试将回调函数传递给您的“VeryLongTimedFunction”,并在每次发生某种“进度”事件时调用它,例如每次处理 50 个项目,或进行 20 次迭代,或者您的操作是什么情况。

于 2012-09-05T12:50:49.487 回答
0

有很多方法可以做到这一点。两个简单的选择:

(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
        }));
    }

在“另一个班级”中

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而不是线程。

要指示进度,只需将WorkerSupportsCancellation属性设置为 true,然后调用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 回答