C#ContinueWith / Return

时间:2015-07-25 12:24:24

标签: c# asynchronous

我对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语句,这是真的。

2 个答案:

答案 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);
}

记住:

  • 使用返回任务或任务的函数的所有函数都应声明为async
  • 所有异步函数返回任务是返回void或任务,如果它们返回TResult。
  • Task返回有一个例外:事件处理程序返回void
  • 调用异步函数后,您可以执行其他操作。
  • 当您需要结果时,请使用await
  • 您只能等待任务或任务
  • await Task的值是TResult

只有一个异步函数不必返回任务,而且是事件处理程序:

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();
}