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

C# web窗体应用程序中的多个后台工作人员,c#,webforms,backgroundworker,C#,Webforms,Backgroundworker,我有一个要求,当客户机向单个网页发出请求时,该网页需要从另外两个网页检索结果 我们请求信息的两个网页在返回结果之前会执行一个过程,这个过程可能需要几分钟,因此,与其启动一个web请求并等待它返回,然后再启动另一个web请求,我希望在后台工作人员中触发这两个请求,并并行生成结果 因此,我的代码类似于以下伪代码: var worker1 = new BackgroundWorker(); var worker2 = new BackgroundWorker(); worker1.DoWork +=

我有一个要求,当客户机向单个网页发出请求时,该网页需要从另外两个网页检索结果

我们请求信息的两个网页在返回结果之前会执行一个过程,这个过程可能需要几分钟,因此,与其启动一个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()}");
    }
}
为简洁起见,我不会将其复制回去,但假设文件名在第二个workers DoWork中更改为worker2.txt

我知道它是粗糙的,但它是有效的,它需要3秒来写出100万次的时间,所以在第一个文件中,我看到的时间从执行时间到执行时间+3秒不等 在第二个文件中,我可以看到从执行时间+3秒到执行时间+6秒的时间范围

因此,在这一点上很明显,一个工人先被处决,然后是另一个,但我不明白为什么

关于项目的更多信息-Web表单这是一项要求,我必须遵守.NET4.5

**编辑以添加:**

回到这个问题后,我查看了我正在调用的页面,注意到页面声明中有aspcompat=true,我认为这是导致问题的原因,我无法删除它

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

为未来读者编辑

请注意,我上面描述的问题和提供的代码是正确的,我遇到的问题是,我调用的页面被设置为使用ASPCOMPAT,这迫使webforms在STA模式下工作,而这正是让我感到不舒服的地方

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

您可以跳过BackgroundWorker,改用Task.WaitAll


为什么不直接使用async/await呢?避免所有BackgroundWorker的胡言乱语,然后使用Task.WaitAll.1执行与上述相同的行为。我的第一个想法是使用异步方法并等待它,但这会得到相同的行为。用我在打电话的页面上看到的东西更新问题。
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");
}