簡體   English   中英

等待異步任務

[英]Async Task await

我試圖理解c#中的異步方法,我創建了一個延遲10秒的wcf服務。 我從控制台應用程序調用wcf服務,從未設置值asyncValue 它只是關閉控制台應用程序。

為什么asyncValue從未設置為Ok?

Wcf服務

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class AsyncService 
{
    [OperationContract]
    public async Task<string> TimeAsync()
    {
        await Task.Delay(10000);
        return "Ok";
    }
}

控制台應用

static void Main(string[] args)
{
    Task<string> asyncValue = GetAsyncTimeFromWcf();           
}

private static async Task<string> GetAsyncTimeFromWcf()
{
    AsyncService.AsyncServiceClient client = new AsyncService.AsyncServiceClient();
    Task<string> asyncTime = client.TimeAsync();

    return await asyncTime;
}

為了使await關鍵字有意義,您需要對返回值進行操作。 async / await功能的目的是允許應用程序繼續其他不相關的代碼,直到您需要使用等待任務的結果為止。

在您的情況下,您調用await但未使用返回值,因此Main方法繼續並有效地存在該應用程序。 例如,嘗試

static void Main(string[] args)
{
    Task<string> asyncValue = GetAsyncTimeFromWcf();
    Console.WriteLine("Waiting for server...");
    Console.WriteLine(String.Format("Result = {0}", asyncValue.Result);
    Console.ReadKey();
}

您應該發現控制台將輸出Waiting for server... 10秒鍾,然后服務器返回后將顯示Ok

您的main方法在WCF調用返回之前結束。

要查看結果,可以添加以下行:

  Console.WriteLine(asyncValue.Result);

Result的調用將Wait任務完成,然后獲得結果。

asyncValue是一個Task,其Task完成時其Result將包含最終值。 您必須通過調用asyncValue.Result或通過調用asyncValue.Wait()等待此結果,然后檢查asyncValue.Result

您不能在控制台程序的Main方法中使用await asyncValueawait GetAsyncTimeFromWcf() ,因為您無法將其標記為async

你試一試:

Task<string> asyncValue = GetAsyncTimeFromWcf(); 
var time=asyncValue.Result;
Console.WriteLine(time);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM