我要求客户向单个网页发出请求,此网页需要从其他两个网页检索结果。
我们请求信息的两个网页在返回结果之前执行一个过程,这个过程可能需要几分钟而不是启动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()}");
}
}
为了简洁起见,我不会将其复制回来,但假设文件名在第二个工作者DoWork()
中更改为worker2.txt它的粗糙我知道,但是它起作用,它需要大约3秒来写出时间100万次所以在第一个文件中我看到时间从执行时间到执行时间+3秒 在第二个文件中,我可以看到从执行时间+3秒到执行时间+6秒的时间。
所以在这一点上很明显,一个工人先被执行然后另一个被执行,但我看不出原因。
有关该项目的更多信息 - Web表单(这是我必须遵守的要求).net 4.5
**编辑添加:**
回到这个问题之后我看了一下我正在调用的页面并注意到它们在页面声明中有aspcompat = true,我认为这是导致问题的原因(它们需要这个,我不能删除它。)
我现在有什么选择?理想情况下,我希望能够将这些页面调用为并行运行,有没有办法在aspcompat设置为true的情况下实现这一点?
为将来的读者编辑
请注意,我上面描述的问题和提供的代码是正确的,我遇到的问题是我调用的页面设置为使用ASPCOMPAT强制webforms在STA模式下工作,这是什么把我扔了。
最后上面的代码确实没有改变,解决方案是将带有后台工作者的页面放在一个单独的Web应用程序中,该应用程序池有自己的应用程序池,该页面使用后台工作人员调用运行的页面在他们的应用程序池中的aspcompat模式 - 它不是理想的,但它是我们想要的实时部署。
答案 0 :(得分:1)
您可以跳过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");
}