【问题标题】:Write status messages to a textbox asynchronously?将状态消息异步写入文本框?
【发布时间】:2010-04-23 16:52:21
【问题描述】:

我最近开始使用 C# 在 WinForms 中进行编程。我有一个要求,我需要搜索一组文件夹和子文件夹,并在搜索时将状态信息显示到文本框 -

正在查找文件夹“C:\Windows”...
找到 8 个文件...
正在将 8 个文件中的第 1 个文件复制到“D:\Temp”...

我有一个方法可以完成所有的搜索和工作。我不知道如何定期将状态消息(如上)显示到文本框。目前,表单等待方法完成,并一次显示所有消息。我希望它们随着方法的进行而一一显示。

提前致谢。

【问题讨论】:

    标签: c# winforms asynchronous


    【解决方案1】:

    要正确解决此问题,您的搜索功能需要在后台线程上运行。如果搜索发生在 UI 线程上,它将阻止对显示的更新,从而阻止显示周期性状态消息。

    在 WinForms 应用程序中执行此操作的最简单方法是使用BackgroundWorker。它至少支持在后台运行任务并将进度信息返回给 UI 线程。此外,还有许多在线教程可帮助您开始使用解决方案。

    【讨论】:

      【解决方案2】:

      使用 BackgroundWorkerThread 和 ReportStatus 函数。这样,您的 UI 将在搜索发生时做出响应。

      【讨论】:

        【解决方案3】:

        运行在单独线程上执行搜索的方法(如果您还没有这样做)。使用async delegate features in .NET 非常简单。

        然后,您可以使用 Control.BeginInvoke() 从工作线程写入文本框 - 您必须这样做,因为对 UI 控件的访问与单个 UI 线程相关。

        您还可以创建一个background worker thread 并使用ReportProgress 方法通知UI 更新。您可以在此处下载并查看此方法的 fairly complete example

        【讨论】: