C#后台工作人员中的异步工作?

C#后台工作人员中的异步工作?,c#,multithreading,asynchronous,backgroundworker,C#,Multithreading,Asynchronous,Backgroundworker,我不擅长多线程,这有点复杂,所以希望我能很好地解释它 基本上,我有一个BackgroundWorker任务,里面有几个从网站检索信息的调用。也许有更好的方法,但我想不出一个。我这样做的原因是因为我希望在所有对网站的调用(以及随后的信息处理)完成时有一个单独的事件 这基本上就是我要做的: private void loadContent() { BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += de

我不擅长多线程,这有点复杂,所以希望我能很好地解释它

基本上,我有一个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);
}
因此,在调用两个getAndProcessInformation方法之后,在实际完成数据处理之前,调用RunWorkerCompleted。有没有办法让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在处理完成之前不会返回。一次只能进行一次提取

如果希望所有抓取器并行工作,则必须删除WaitOne,并让getAndProcessInformation返回等待句柄。然后在DoWork中,您可以执行一个等待操作,等待所有句柄发出信号