【问题标题】:Making function run async, makes async WCF call within that function run improperly使函数异步运行,使该函数中的异步 WCF 调用运行不正确
【发布时间】:2014-02-27 10:05:56
【问题描述】:

我正在使用 Amazon SQS 上传图像文件。我有一个函数可以检查新的 SQS 消息并循环读取消息并运行函数

代码:

if (receiveMessageResponse.ReceiveMessageResult.Message.Count != 0)
 {
   for (int i = 0; i < receiveMessageResponse.ReceiveMessageResult.Message.Count; i++)
             {
                 string messageBody = receiveMessageResponse.ReceiveMessageResult.Message[i].Body; // read as json text
                 dynamic dynResult = JObject.Parse(messageBody);
                 ImageServiceReference.statePackage sp = new ImageServiceReference.statePackage();

                 ..... // some sp objevt initialization

                 Task.Factory.StartNew(() =>
                  {
                      SaveImageProcedure(sp); 
                  });
          }
}

在工作代码中,我在没有任务的情况下调用SaveImageProcedure(同步)。但现在我想让SaveImageProcedure 异步运行。

在那个函数 SaveImageProcedure 我有一个任务:

var task = Task<int>.Factory.FromAsync(proxy.BeginSaveImage(sp, new AsyncCallback(CompleteSave), state), proxy.EndSaveImage);

此任务调用异步处理长图像的 WCF 服务。

我的问题:

当我使用Task.Factory.StartNew 异步调用 SaveImageProcedure 时,WCF 不会处理图像,无论当我在没有Task.Factory.StartNew(只是函数名本身)的情况下运行它时,它运行良好并且我看到图像已处理。

我不明白为什么当我进行更改以异步运行 SaveImageProcedure 函数时,它会导致 WCF 无法像同步运行那样工作。

【问题讨论】:

    标签: c# .net wcf asynchronous async-await


    【解决方案1】:

    SaveImageProcedure 已经是异步的,因为 Task&lt;int&gt;.Factory.FromAsync 是异步的。为什么你需要Task.Factory.StartNew 围绕它?这将使用一个额外的线程,一旦你用完线程池中的所有线程,程序将变得非常慢,因为使用非常慢的爬山算法增加了线程池的大小。当例程运行时,我很想看看你程序中的线程数。

    【讨论】:

    • 当我使用 int res = task.Result; 运行任务时;在 Task.Factory... 代码之后,它会等待它完成,然后再继续(在循环中使用),因此由于某种原因,图像会被一张一张地处理。当我在任务中使用异步调用包装函数时,它会并行处理图像。为什么会这样?它似乎在等待 FromAsync 完成,然后继续下一个循环迭代。
    • task.Result 阻塞直到任务完成,这就是您观察该行为的原因。你应该做task.ContinueWith(t =&gt; int res = t.Result) 'ContinueWith` 语句在任务完成后被调用,这样 task.Result 就不会阻塞。
    猜你喜欢
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多