2

我为自己创建了一个阅读 RSS 提要并将它们返回给我的主类的类。我用于此的代码是:

public List<Post> getLatestPosts()
{
    this.rssReader = new XmlTextReader(this.rssUrl);
    this.rssDoc = new XmlDocument();

    // Load the XML content into rssDoc
    rssDoc.Load(rssReader);

    // ... other code to parse XML ... //
}

现在,当我调用getLatestPosts()我的应用程序时,它会锁定几秒钟。我假设这是因为这是应用程序请求 RSS 提要(网络延迟等)所需的时间。

我想改变它,这样我的程序就不会锁定,而只是等待响应。我有在我的主窗体中使用线程的想法,但我对如何捕获任何 RSS 数据感到困惑getLatestPosts()

如果我在按钮中执行此操作,请单击我的主表单:

private void bGetLatestPosts_Click(object sender, EventArgs e)
{
    Thread thread = new Thread(new ThreadStart(rssReader.getLatestPosts()));
}

我没有捕捉任何getLatestPosts()返回的东西。

我对线程完全陌生(这主要是我在尝试学习它们),但我确实有一些C# 经验。

谢谢。

4

1 回答 1

2

我假设您正在编写一个 WinForms 应用程序。编写响应式 WinForms 应用程序有两个重要规则:

  • 您在主 UI 线程上执行的所有操作都应该快速完成。
  • 您不能从主线程以外的任何线程访问控件。

要解决您的问题,请在BackgroundWorker.

BackgroundWorker 类允许您在单独的专用线程上运行操作。下载和数据库事务等耗时的操作可能会导致您的用户界面 (UI) 在运行时似乎停止响应。当您需要响应式 UI 并且面临与此类操作相关的长时间延迟时,BackgroundWorker 类提供了一种方便的解决方案。

要在后台执行耗时的操作,请创建一个 BackgroundWorker 并侦听报告操作进度并在操作完成时发出信号的事件。您可以通过编程方式创建 BackgroundWorker,也可以从工具箱的“组件”选项卡将其拖到表单上。如果在 Windows 窗体设计器中创建 BackgroundWorker,它将出现在组件托盘中,其属性将显示在属性窗口中。

要设置后台操作,请为 DoWork 事件添加事件处理程序。在此事件处理程序中调用您的耗时操作。要开始操作,请调用 RunWorkerAsync。要接收进度更新通知,请处理 ProgressChanged 事件。要在操作完成时接收通知,请处理 RunWorkerCompleted 事件。

以下是一些可能对您有所帮助的代码:

private void bGetLatestPosts_Click(object sender, EventArgs e)
{
    bGetLatestPosts.Enabled = false;
    backgroundWorker.RunWorkerAsync();
}

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    e.Result = getLatestPosts();
}

private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Error != null)
    {
        // Handle exception...
    }
    else
    {
        List<Post> result = (List<Post>)e.Result;
        // Update GUI...
    }
    bGetLatestPosts.Enabled = true;
}
于 2012-08-25T20:59:54.277 回答