我在实际应用中对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 。对此有任何意见吗?
答案 0 :(得分:1)
我不确定,但一切似乎都没问题。我没有和knockout
一起工作,这部分对我而言似乎等到所有任务完成后才会出现。或类似的东西
self.compositionComplete = function()
{
self.Data1();
self.Data2();
}
当他们两个完成时会发生类似的事情。也许你可以使用不同的self
。