异步并等待方法

时间:2017-10-24 09:51:53

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

我在实际应用中对C#中的异步和等待方法做了澄清。请考虑以下流程,它是工作代码的简单版本:

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 等待的想法是在屏幕上呈现 self.Data1 并且不要等到 self.Data2 已被检索。 不幸的是,它没有发生,我将不得不等待100秒才能在屏幕上显示数据1 数据2 。我需要更改什么才能确保将单独的线程用于 GetData1 GetData2

还有一个观察结果是,如果我在 self.Data1()上成功调用 self.Data2 ,如下所示,我可以看到 Data1 < / strong>立即在屏幕上,但这不是我想要的。我需要并行和非常地呈现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 。对此有任何意见吗?

1 个答案:

答案 0 :(得分:1)

我不确定,但一切似乎都没问题。我没有和knockout一起工作,这部分对我而言似乎等到所有任务完成后才会出现。或类似的东西

self.compositionComplete = function()
{
  self.Data1();
  self.Data2();
}
当他们两个完成时会发生类似的事情。也许你可以使用不同的self