Asp.net mvc 2 ASP.NET MVC2 AsyncController:串联执行多个异步操作是否会导致可能的争用情况? 序文

Asp.net mvc 2 ASP.NET MVC2 AsyncController:串联执行多个异步操作是否会导致可能的争用情况? 序文,asp.net-mvc-2,asynchronous,race-condition,Asp.net Mvc 2,Asynchronous,Race Condition,我们正在实现一个MVC2站点,该站点需要通过https使用外部API(恐怕我们不能使用WCF,甚至不能使用老式的SOAP Web服务)。我们在需要与API通信的任何地方使用AsyncController,到目前为止一切都运行良好 在某些场景中,我们需要进行多个API串联调用,使用一个步骤的结果执行下一个步骤 到目前为止,一般模式(为了演示而简化)如下所示: public class WhateverController : AsyncController { public void Do

我们正在实现一个MVC2站点,该站点需要通过https使用外部API(恐怕我们不能使用WCF,甚至不能使用老式的SOAP Web服务)。我们在需要与API通信的任何地方使用
AsyncController
,到目前为止一切都运行良好

在某些场景中,我们需要进行多个API串联调用,使用一个步骤的结果执行下一个步骤

到目前为止,一般模式(为了演示而简化)如下所示:

public class WhateverController : AsyncController
{
    public void DoStuffAsync(DoStuffModel data)
    {
        AsyncManager.OutstandingOperations.Increment();
        var apiUri = API.getCorrectServiceUri();
        var req = new WebClient();
        req.DownloadStringCompleted += (sender, e) =>
        {
            AsyncManager.Parameters["result"] = e.Result;
            AsyncManager.OutstandingOperations.Decrement();
        };
        req.DownloadStringAsync(apiUri);
    }

    public ActionResult DoStuffCompleted(string result)
    {
        return View(result);
    }
}
我们有几个操作需要并行执行API调用,但已经可以很好地工作了;我们只需执行多个请求,并确保正确地递增
AsyncManager.OutstandingOperations

情景 为了串联执行多个API服务请求,我们目前正在为第一个请求的
DownloadStringCompleted
调用事件处理程序中的下一步。例如

req.DownloadStringCompleted += (sender, e) =>
{
    AsyncManager.Parameters["step1"] = e.Result;
    OtherActionAsync(e.Result);
    AsyncManager.OutstandingOperations.Decrement();
}
其中,
OtherActionAsync
是在同一控制器中定义的另一个动作,其模式与上面定义的相同

问题 在访问
AsyncManager
中的值时,从事件处理程序中调用其他异步操作是否会导致可能的争用

我试着查看MSDN,但是所有关于
AsyncManager.Sync()
的评论都是关于
IAsyncCallback
的BeginMethod/EndMethod模式。在这种情况下,文档会警告潜在的竞争条件

我们不需要在控制器中实际调用另一个操作,如果这让您不快的话。构建另一个
WebClient
并在其上调用
.DownloadStringAsync()
的代码可以很容易地放在第一个请求的事件处理程序中。我刚刚在这里展示了它,使它更容易阅读

希望这是有道理的!如果没有,请留下评论,我将尝试澄清任何你喜欢的


谢谢

结果是答案是“不”


(供将来参考,以防任何人通过搜索遇到此问题)

在本例中,OtherActionAsync(e.Result)是否会被异步调用?当WebClient完成下载字符串时,它不会被同步调用吗?它将包括对.DownloadStringAsync()的另一个调用,该调用将有自己的DownloadStringCompleted事件处理程序。嗯,好的,我仍在努力查看您的位置,很抱歉。只要未完成的操作正确递增和递减,那么所有值都应该在dostuff completed中可用。我不确定事件处理程序是否保证在同一线程中执行,以及它们是否需要调用AsyncManager.Sync()以确保它们在相同的.Parameters上工作(与.OutstandingOperations相同)从您的代码示例中,不清楚OtherActionAsync正在做什么。您是否在启动另一个请求时再次递增未完成的操作?当挂起的异步操作变为0时,ASP.NET将立即调用ActionCompleted方法。