gpt4 book ai didi

BackgroundWorker 中的 C# 异步工作?

转载 作者:太空宇宙 更新时间:2023-11-03 14:10:03 25 4
gpt4 key购买 nike

我不是最擅长多线程的,这有点复杂,所以希望我能解释清楚。

基本上,我拥有的是一个 BackgroundWorker 任务,其中有几个从网站检索信息的调用。可能有更好的方法来做到这一点,但我想不出一个。我这样做的原因是因为我想有一个单一的事件来指示何时完成所有 对网站的调用(以及信息的后续处理)。

这基本上就是我正在做的事情:

private void loadContent() {
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += delegate(object sender, DoWorkEventArgs e) {
getAndProcessInformation(desiredInformationName);
getAndProcessInformation(someOtherDesiredInformationName);
};
worker.RunWorkerCompleted += delegate(object sender, RunWorkerCompletedEventArgs e) {
MessageBox.Show("Finished!");
Dispatcher.BeginInvoke(() => { progressBar(false); });
};
worker.RunWorkerAsync();
}
private void getAndProcessInformation(string theInformationIWant){
Fetcher dataFetcher = new Fetcher(); //Fetcher is a custom class that reads information from a web server
dataFetch.receivedData += delegate(DataResponseArgs args) {
//Process some data
};
dataFetch.requestData(theInformationIWant);
}

因此,RunWorkerCompleted 在两个 getAndProcessInformation 方法被调用之后,数据实际完成处理之前立即被调用。有什么方法可以让 RunWorkerCompleted 仅在方法中的处理实际完成后运行?

现在,我可以看到 BackgroundWorker 并不是真正必要的,因为处理实际上已经在一个单独的线程中完成,但我不知道有什么替代方法可以让我获得一个事件的预期结果当所有处理完成时触发。所以,我想这实际上是两个问题;我是否应该继续使用 BackgroundWorker,如果是,我该如何修复它,或者,如果不是,还有什么替代方案?

最佳答案

如果您的 Fetcher 已经在创建自己的线程,那么使用 BackgroundWorker 就没有多大意义,就像您已经发现的那样。

因为您还没有分享 Fetcher 的实现。如果你想坚持你已经拥有的东西,它可能应该是这样的

private void getAndProcessInformation(string theInformationIWant){
Fetcher dataFetcher = new Fetcher();
var eventHandle = new ManualResetEvent(false);
dataFetch.receivedData += delegate(DataResponseArgs args) {
//Process some data
eventHandle.Set();
};
dataFetch.requestData(theInformationIWant);
eventHandle.WaitOne();
}

这样函数 getAndProcessInformation 在处理完成之前不会返回。一次只有一个 Fetch 工作。

如果您希望所有 Fetcher 并行工作,您可以删除 WaitOne 并让 getAndProcessInformation 返回等待句柄。然后在 DoWork 中,您可以等待所有句柄收到信号。

关于BackgroundWorker 中的 C# 异步工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8089656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com