Web窗体应用程序中的多个后台工作人员

问题描述:

我有一个要求,在客户端向单个网页发出请求时,此网页需要从两个其他网页中检索结果。Web窗体应用程序中的多个后台工作人员

我们要求信息的两个网页在返回结果之前执行一个过程,这个过程可能需要几分钟的时间,而不是启动一个Web请求并等待它返回,然后开始另一个我想要消除后台工作人员的这两项请求,并将结果同时生成。

所以我的代码看起来是这样的(伪代码):

var worker1 = new BackgroundWorker(); 
var worker2 = new BackgroundWorker(); 

worker1.DoWork += (s, e) => { 
//Web Request done here 
}; 

worker2.DoWork += (s, e) => { 
    //Web Request done here 
}; 

worker1.RunWorkerAsync(); 
worker2.RunWorkerAsync(); 

//Some logic here that basically waits for both to return. 

现在我注意到,结果仍然需要更长的时间来恢复比我预料的,所以我做了一下测试,并改变了内容在DoWork的对

using (var sw = new StreamWriter(@"c:\temp\TEST\Worker1.txt")) 
{ 
    for (int i = 0; i < 1000000; i++) 
    { 
     sw.WriteLine($"{i} - {DateTime.Now.ToLongTimeString()}"); 
    } 
} 

为了简便起见,我不会复制此退了出来,但假设该文件的名称改为中worker2.txt第二工人的DoWork()

其原理我知道,但它的工作原理,它需要约3秒钟的时间写出100万次,所以在第一个文件中,我看到从执行时间到执行时间+ 3秒的时间 在第二个文件中,我可以看到时间范围从执行时间+3秒到执行时间+6秒。

所以很明显,在这一点上,一名工人先被执行,然后是另一名工人,但我看不出为什么。

关于该项目的更多信息 - Web表单(这是我一直在考虑和必须坚持的要求).NET 4.5

**编辑补充:**

回来后这个问题我看了一下我正在调用的页面,注意到它们在页面声明中有aspcompat = true,我认为是导致该问题的原因(他们需要这个,我不能删除它)。

我现在有哪些选择?理想情况下,我希望能够调用这些页面并行运行,有没有什么办法可以在aspcompat设置为true的情况下实现这一目标?


编辑为未来的读者

注意,我上述的问题,这是提供的代码是正确的,我有这个问题是,我是调用页面被设置成使用ASPCOMPAT,它强制webforms在STA模式下工作,这是抛弃我的东西。

最后,上面的代码没有改变,解决方案是将页面与后台工作人员放在一个单独的具有自己的应用程序池的Web应用程序中,该页面使用后台工作人员关闭页面在其应用程序池中以aspcompat模式运行 - 它并不理想,但它仍然是我们想要的实时部署。

+0

为什么不只是使用async/await?避免所有的BackgroundWorker废话,然后'Task.WaitAll()'。 – axlj

+0

与上述相同的行为。 – D3vy

您可以跳过BackgroundWorker并使用Task.WaitAll()代替。

void Main() 
{ 
    Task.WaitAll(FirstRequest(), SecondRequest()); 
} 

// Define other methods and classes here 
private async static Task FirstRequest() 
{ 
    // Do your work for one of the WebRequests here 
    await Task.Delay(3000); 
    Console.WriteLine("Done with 1"); 
} 

private async static Task SecondRequest() 
{ 
    // Do your work for the second WebRequest here 
    await Task.Delay(3000); 
    Console.WriteLine("Done with 2"); 
} 
+0

我的第一个想法是使用异步方法并等待它,但是这得到相同的行为。 用我刚刚在我打电话的页面中发现的事物更新问题。 – D3vy