我对C#中的异步编程有点新,并且在一个小但令人沮丧的挑战中苦苦挣扎。
我有一个运行良好的ASP.Net MVC WEB API。另一方面,我创建了这个WEB API客户端方法:
UInt8(theUnsafeMutablePointerVar)
这似乎工作得很好......
从WPF视图模型调用此方法,这就是我的问题所在......
public async Task<DTOVArt> GetVArtFormArt(DTOArt art)
{
using (var client = GetHttpClient())
{
var response = await client.GetAsync("api/APIVArt/Get/" + art.ART_ID);
if (!response.IsSuccessStatusCode) return null;
var arts = await response.Content.ReadAsAsync<DTOVArt>();
return arts;
}
}
问题是这最后一个方法在它到达ContinueWith语句块之前执行return语句,它实际上设置了应该返回的类中的值。
尝试进行任何类型的Wait()或使用.Result而不是ContinueWith只会阻止所有事情。
如果我在ContinueWith块中返回,C#编译器说该方法缺少一个return语句,这是真的。
答案 0 :(得分:1)
这就是异步的本质。因为您的调用是异步的,所以它将在稍后执行,下面的代码将继续执行。
尝试添加digitalWrite()
,如果这是调用的#include <LED.h>
LED led;
void setup() {
led.begin(13);
}
void loop() {
led.on();
delay(500);
led.off();
delay(500);
}
,则只删除await
,通常是事件处理程序:
ContinueWith
如果您仍想返回异步任务,以便调用此方法的任何调用方都可以等待结果,请尝试:
root
答案 1 :(得分:0)
使用async / await时,不必再使用ContinueWith了。 ContinueWith表示:等到上一个结束并使用结果进行下一个。
async await为你做这件事。
假设您有一个异步功能。所有异步函数都返回Task(用于void返回)或Task <TResult
&gt;如果返回类型为TResult
private async Task<int> SlowAdditionAsync(int a, int b)
{
await Task.Delay(TimeSpan.FromSeconds(5); // causing the slow part
return a + b;
}
用法:
private async Task PerformSlowAddition()
{
int a = ...;
int b = ...;
int x =await SlowAditionAsync(a, b);
// the statement after the await, the task is finished, the result is in x.
// You can used the result as if you used Continuewith:
DisplayAddition(x);
}
或者如果您想在计算过程中做其他事情:
private async Task PerformSlowAddition()
{
int a = ...;
int b = ...;
var taskSlowAddition = SlowAditionAsync(a, b);
DoSomethingElse(); // while the calculator does its thing
// now we need the result:
int x = await taskSlowAddition;
// no need to use ContinueWith, the next statement will be executed:
DisplayAddition(x);
}
记住:
只有一个异步函数不必返回任务,而且是事件处理程序:
private async void OnButton1_Clicked(object sender, ...)
{
var taskX = DosomethingAsync(...)
DoSomethingElse();'
// now we need the result of taskX:
var x = await TaskX;
ProcessReault(x)
}
请注意,虽然事件处理程序不返回任务,但它仍然是异步
如果您的某些语句需要在用户界面保持响应时在后台运行,请使用Task.Factory.StartNew()或更现代的Task.Run():
private int SlowCalculation(int a, int b)
{
// do something really difficult and slow
System.Threading.Thread.Sleep(TimeSpan.FromSeconds(5));
return a + b;
}
// make it async:
private async Task<int> SlowCalculationAsync(int a, int b)
{
return await Task.Run( () => SlowCalculation(a, b));
}
用法:
private async Task CalculateAsync()
{
int a = ...;
int b = ...;
int x = await SlowCalculationAsync(a, b);
Display(x);
}
private async void OnButton1_clicked(object sender, ...)
{
await CalculateAsync();
}