当前位置: 首页 > 知识库问答 >
问题:

异步和等待方法

臧曜瑞
2023-03-14

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

助手.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;
        }
}

功能控制器.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调用并使用异步和等待是为了呈现自我。屏幕上显示数据1,不要等到自己。Data2已被检索。不幸的是,这种情况没有发生,我必须等待100秒,以便Data 1和Data 2都显示在屏幕上。我需要更改什么,以确保GetData1和GetData2使用单独的线程。

还有一个观察是,如果我称呼自己。关于自我成功的数据2。Data1()如下所示,我能够立即在屏幕上看到Data1,但这不是我想要的。我需要数据 1 和 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个答案

琴俊人
2023-03-14

我不确定,但一切似乎都很好。我没有使用Knockout,这部分在我看来是“等到所有任务完成”或类似的东西。

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

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

 类似资料:
  • 我试图在react/electron项目中使用async/await,但它不起作用。我想要的是获取docker容器状态列表。但是安慰。日志(列表)返回未定义的。 有人能帮我吗?:)

  • 我正在尝试将数据库调用移出控制器,以清理并使其可测试。当它们在控制器中时,一切都会顺利进行。我将它们移出控制器,并添加了一个异步,以确保我们等待。否则,我将调用的中的函数。现在,一旦我使用async/await,控制器中的函数就会认为没有用户,因为它没有等待。 有几个关于异步等待的SO问题,但我没有找到一个解决我的问题。我确实验证了返回了我的用户,并添加了控制台日志来显示路径。 节点猫鼬异步等待似

  • 我一直试图理解C#中的Async/await和Task,但尽管看了youtube视频,阅读了文档,并参加了pluralsight课程,但一直失败得很厉害。 我希望有人能帮助回答这些稍微抽象的问题,帮助我的大脑摆脱困境。 1.为什么说async/await启用了一个“Asynchonrous”方法,而async关键字本身什么也不做,而await关键字添加了一个挂起点?添加挂起点不是强制方法同步操作,

  • 任务或任务 我们也可以定义自己的可实现对象。对象应具有以下资格。 < li >它有一个GetAwaiter()方法(实例方法或扩展方法); < li >其GetAwaiter()方法返回一个Awaiter。在下列情况下,对象是一个标识符: < ul > < li >它实现INotifyCompletion或ICriticalNotifyCompletion接口; < li >它有一个IsCompl

  • 我通读了Dart/flatter中的Async/Await/then,试图理解为什么aysnc函数中的Await不会等到完成后再继续。在我的UI中,有一个按钮调用一个异步方法来返回一个位置,该位置总是返回null,并且不等待函数完成。 该函数将调用推送到一个新的UI页面,该页面选择一个位置,并应返回一个结果。如何使该函数等待结果?我不是在使用异步吗?

  • 我正在编写一个WinForms应用程序,它将数据传输到USB HID类设备。我的应用程序使用了优秀的通用HID库V6.0,可以在这里找到。简单来说,当我需要向设备写入数据时,这是被调用的代码: 当我的代码退出while循环时,我需要从设备中读取一些数据。但是,设备无法立即响应,因此我需要等待此呼叫返回后再继续。由于当前存在,RequestToGetInputReport()声明如下: GetInp