【问题标题】:Async and await Methods异步和等待方法
【发布时间】:2017-10-24 09:51:53
【问题描述】:

我在实际应用中对 C# 中的 async 和 await 方法进行了说明。考虑以下流程,它是工作代码的简单版本:

Helper.cs

public class Helper
{
   public CustomDTP _customDTO = null;
   public async Task<Analysis> GetAnalysis(string name, int id,string option)
        {

          if(option == "a")
           {
             //Call ThirdParty service and get Data
             _CustomDTO.Data1 = await GetData1(name,id);
           }
          else if(option == "b")
           {
             //Call ThirdParty service and get Data
             _CustomDTO.Data2 = await GetData2(name,id);
           }
          return _customDTO;
        }
}

FunctionController.cs

    [HttpPost]
    [EnableQuery]
    [ODataRoute("ProcessData")]
    public async Task<string> ProcessData(HttpRequestMessage message)
    {

            var js = new JavaScriptSerializer();
            var Result = message.Content.ReadAsStringAsync().Result;
            info = js.Deserialize<CustomDTO>(Result);

            Helper Servc = new Helper();

            var DetailData = await Servc.GetAnalysis(info);

            Data = Newtonsoft.Json.JsonConvert.SerializeObject(DetailData);
        return Data;
       }

processing.js

//Knockout js application

self.compositionComplete = function()
{
  self.Data1();
  self.Data2();
}
 self.Data1 = function () {
            var getURL = Url + "/ProcessData";
            var initData = {
                "name": self.name,
                "id": self.id,
                "option": "a"
            }
        $.ajax({
                url: getURL,
                cache: false,
                type: "POST",                
                data: JSON.stringify(initData),
                dataType: 'json',
                success: function (result) {
                    //Rendering Data Logic for Option a
        });
}

self.Data2 = function () {
            var getURL = Url + "/ProcessData";
            var initData = {
                "name": self.name,
                "id": self.id,
                "option": "b"
            }
        $.ajax({
                url: getURL,
                cache: false,
                type: "POST",                
                data: JSON.stringify(initData),
                dataType: 'json',
                success: function (result) {
                    //Rendering Data Logic for Option b
        });
}

现在,问题是第三方服务的GetData1() 需要更少的时间(例如:2 秒)而GetData2() 需要更多的时间(例如:100 秒)。进行两次 ajax 调用并使用 async 和 await 的想法是在屏幕上呈现 self.Data1 而不要等到 self.Data2 已被检索到。 不幸的是,这并没有发生,我必须等待 100 秒才能在屏幕上显示 Data 1 和 Data 2。我需要更改什么以确保 GetData1 和 GetData2 使用单独的线程。

另一个观察结果是,如果我在 self.Data1() 上成功调用 self.Data2,如下所示,我可以看到 Data1 立即出现在屏幕上,但这不是我想要的。我需要同时渲染 Data1 和 Data2 并异步渲染。

self.Data1 = function () {
            var getURL = Url + "/ProcessData";
            var initData = {
                "name": self.name,
                "id": self.id,
                "option": "a"
            }
        $.ajax({
                url: getURL,
                cache: false,
                type: "POST",                
                data: JSON.stringify(initData),
                dataType: 'json',
                success: function (result) {
                    self.Data2();
        });
}

我确定线程在使用 await 后被阻塞,但我无法获得进行单独调用和并行渲染 Data1 和 Data2 的分辨率。对此有何意见?

【问题讨论】:

  • 嗨,您是否尝试过异步 ajax,可能会有所帮助,因为 Data2 不会像这样等待 Data1 完成 --- async : true --- 在 POST 之后
  • @WindyHen 默认情况下 $.ajax 调用本质上是异步的。

标签: javascript c# .net multithreading c#-4.0


【解决方案1】:

我不确定,但一切似乎都还好。我没有与knockout 合作过,这部分在我看来是“等到所有任务完成”或类似的东西

self.compositionComplete = function()
{
  self.Data1();
  self.Data2();
}

当他们两个都完成时,就像被解雇了。也许你可以使用不同的self。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    • 2012-07-31
    相关资源
    最近更新 更多