c# - 在 C# 中对现有代码实现多线程的最简单方法是什么

标签 c# wpf multithreading

我已经实现了一个功能应用程序,它可以一次性解析 26 个 html 页,以生成一个包含网页上数据的 xml 文件。我需要实现一个线程,以便此方法可以在后台工作,而不会导致我的应用程序看起来没有响应。

其次,我有另一个与第一个函数分离的函数,它比较两个 xml 文件以生成第三个文件,然后使用 XSLT 转换第三个 xml 文件以生成 html 页面。这必须在一个线程上,我可以单击“取消”来停止线程而不会使应用程序崩溃。

在 VS 2010 中使用 WPF 表单执行此操作的最简单的最佳方法是什么?

我选择使用BackgroundWorker。

BackgroundWorker 实现:

public partial class MainWindow : Window
    {
        private BackgroundWorker bw = new BackgroundWorker();

        public MainWindow()
        {
            InitializeComponent();
            bw.WorkerReportsProgress = true;
            bw.DoWork += new DoWorkEventHandler(bw_DoWork);
            bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            this.LoadFiles();
        }

        private void btnCompare_Click(object sender, EventArgs e)
        {
            if (bw.IsBusy != true)
            {
                progressBar2.IsIndeterminate = true;
                // Start the asynchronous operation.
                bw.RunWorkerAsync();
            }

        }

        private void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            StatsProcessor proc = new StatsProcessor();
            if (lstStatsBox1.SelectedItem != null)
                if (lstStatsBox2.SelectedItem != null)
                    proc.CompareStats(lstStatsBox1.SelectedItem.ToString(), lstStatsBox2.SelectedItem.ToString());
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            progressBar2.IsIndeterminate = false;
            progressBar2.Value = 100;
        }

我已经开始使用 bgworker 解决方案,但单击 btnCompare 时似乎从未调用 bw_DoWork 方法,我一定做错了什么......我是线程新手。

最佳答案

如果您是线程新手,我认为最简单的开始是使用 BackgroundWorker :

  • 它使用另一个线程:您可以在应用保持响应的同时异步执行 HTML 解析
  • 支持取消:您可以取消XML到HTML的转换

BackgroundWorker 是事件驱动的,因此如果您不熟悉多线程,那么您会更容易上手。 .NET 4 任务库更加灵活,但需要更多的参与,尤其是在 UI 更新方面。

示例:

BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler((o, args) =>
{
    //Long running stuff here       
    Thread.Sleep(10000);
    string result = "Hi UI!";
    args.Result = result;
});

worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler((o, args) =>
{
    if (args.Result != null)
    {
        SomeTextBox.Text = args.Result;
    }
});

worker.RunWorkerAsync();

关于c# - 在 C# 中对现有代码实现多线程的最简单方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4631844/

相关文章:

C# char计算问题

c# - 在 C# 和 C++ 之间交换对象

c# - Blend + Sketchflow 2012 中禁用的设计 View

c# - 分配给 TCP 网络线程池的线程数?

C# 通用存储库 - 工作单元 - 线程安全

c - Malloc 没有失败,但系统内存不足

c# - 更改动态创建的文本框的工具提示样式?

c# - 涉及动态内容时从字符串资源翻译?

c# - 使用 WPF 窗体 DataGrid、DataTable 和 Combobox

wpf - RelativeSource FindAncestor 问题