0

我有我需要做一些工作的文件(小部件)列表。我想以异步方式执行此操作,以便我的界面保持响应。我想用进度更新 UI。这是我的原型代码。我该如何做到这一点?我假设我需要使用线程,但我也不想同时跨越所有线程,一个接一个就可以了。

void Process()
{
    var documents = GetDocuments();
    foreach(document in documents)
    {
        ProcessDocument(
        document,
        status => this.TextBox.Text += status); 
    }
}

void ProcessDocument(Document document, Action<string> onCompleted)
{
}
4

4 回答 4

1

您可以使用BackgroundWorker 类来处理 Windows 窗体项目中的异步操作。

BackgroundWorker worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.DoWork += (sender, args) => {
    var documents = GetDocuments();
    foreach(var document in documents)
    {
        ProcessDocument(document);
        worker.ReportProgress(0, status);
    }
};
worker.ProgressChanged += (sender, args) => {
    this.TextBox.Text += args.UserState.ToString();
};
worker.RunWorkerAsync();
于 2012-11-13T23:04:35.313 回答
1

您可以使用System.Threading.Thread

请记住,您将需要使用委托来安全地更新 UI 上的控件,当在主 UI 线程之外运行时,您无法修改控件。

如果你想在没有委托的情况下轻松完成,因为你认为你可以控制它,你可以设置属性

Control.CheckForIllegalCrossThreadCalls=false

因此,您将被允许在没有非法跨线程检查的情况下更新控件

如果您更喜欢使用 BackgroundWorker 类,这允许您绑定一个名为 ProgressChanged 的​​事件,它也允许您更新 UI

public void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
     //thread work
    }

    // This event handler updates the UI
    private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        // Update the UI here

    }
于 2012-11-13T23:08:20.763 回答
0

Framework 4.5 引入了简化异步 .NET 编程的async/await关键字。

如果您使用的是 Framework 4,请查看TPL 。

另一方面,如果您使用的是早期版本的 .NET(3.5 和更早版本),那么您应该看看APM

于 2012-11-13T23:39:36.543 回答
0

还要考虑反应式扩展,尤其是IObservable<T>

于 2012-11-13T23:14:49.973 回答