2014-02-18 129 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);