2014-02-18 333 views
1

我想了解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; 
} 
+0

等待'asyncValue' –

+2

@ L.B你不能'等待asyncValue'的'main'方法中,因爲沒有被標記爲'async',你不能標記主要是異步。 – Alberto

+0

'asyncValue.Result' –

回答

2

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

你會發現,控制檯將10秒輸出Waiting for server...那麼一旦服務器返回它會顯示Ok

+0

我現在明白了。我不得不創造一個學習和理解的例子,但我陷入了困境。非常感謝 :) – user3046164

1

main方法WCF調用返回前結束。

看到的結果,你可以添加一行:

Console.WriteLine(asyncValue.Result); 

Result的調用,將用於完成,然後得到的結果任務Wait

1

asyncValue是一項任務,其Result將包含完成時的最終值。您必須通過致電asyncValue.Result或致電asyncValue.Wait()等待此結果,然後再檢查asyncValue.Result

在Console程序的Main方法中不能使用await asyncValueawait GetAsyncTimeFromWcf(),因爲您不能將其標記爲async

試試看:

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