我已经实现了一个功能应用程序,它可以一次性解析 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/