C# 异步任务等待
我试图理解c中的异步方法# 我创建了一个延迟10秒的wcf服务。我从控制台应用程序调用wcf服务,值asyncValue从不设置。它只是关闭控制台应用程序 为什么asyncValue从未设置为Ok Wcf服务C# 异步任务等待,c#,.net,wcf,async-await,C#,.net,Wcf,Async Await,我试图理解c中的异步方法# 我创建了一个延迟10秒的wcf服务。我从控制台应用程序调用wcf服务,值asyncValue从不设置。它只是关闭控制台应用程序 为什么asyncValue从未设置为Ok Wcf服务 [ServiceContract] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class AsyncService {
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class AsyncService
{
[OperationContract]
public async Task<string> TimeAsync()
{
await Task.Delay(10000);
return "Ok";
}
}
[服务合同]
[AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)]
公共类异步服务
{
[经营合同]
公共异步任务TimeAsync()
{
等待任务。延迟(10000);
返回“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;
}
static void Main(字符串[]args)
{
任务asyncValue=GetAsyncTimeFromWcf();
}
专用静态异步任务GetAsyncTimeFromWcf()
{
AsyncService.AsyncServiceClient=新的AsyncService.AsyncServiceClient();
Task asyncTime=client.TimeAsync();
返回等待时间;
}
您的main
方法在WCF调用返回之前结束
要查看结果,可以添加以下行:
Console.WriteLine(asyncValue.Result);
对的调用将使任务完成,然后获得结果。您的
main
方法在WCF调用返回之前结束
要查看结果,可以添加以下行:
Console.WriteLine(asyncValue.Result);
对的调用将使任务完成,然后获得结果。对于
wait
关键字,您需要对返回值执行一些操作。async
/await
功能的目的是允许应用程序继续使用其他不相关的代码,直到您需要使用等待的任务的结果为止
在您的情况下,调用wait
,但不使用返回值,因此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();
}
static void Main(字符串[]args)
{
任务asyncValue=GetAsyncTimeFromWcf();
Console.WriteLine(“等待服务器…”);
WriteLine(String.Format(“Result={0}”,asyncValue.Result);
Console.ReadKey();
}
您应该会发现控制台将输出等待服务器的
。
10秒,然后一旦服务器返回,它将显示Ok
以显示wait
关键字,以便理解您需要对返回值做些什么。async
/wait
功能的目的是允许应用程序n继续使用其他不相关的代码,直到需要使用等待的任务的结果
在本例中,您调用wait
,但不使用返回值,因此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();
}
static void Main(字符串[]args)
{
任务asyncValue=GetAsyncTimeFromWcf();
Console.WriteLine(“等待服务器…”);
WriteLine(String.Format(“Result={0}”,asyncValue.Result);
Console.ReadKey();
}
您应该会发现控制台将输出
等待服务器…
10秒,然后一旦服务器返回,它将显示Ok
asyncValue
是一个任务,其结果
将在完成时包含最终值。您必须通过调用asyncValue.Result
来等待此结果或者调用asyncValue.Wait()
,然后选中asyncValue.Result
不能在控制台程序的Main
方法中使用await asyncValue
或await GetAsyncTimeFromWcf()
,因为不能将其标记为async
试试看:
Task<string> asyncValue = GetAsyncTimeFromWcf();
var time=asyncValue.Result;
Console.WriteLine(time);
Task asyncValue=GetAsyncTimeFromWcf();
var time=asyncValue.Result;
控制台写入线(时间);
asyncValue
是一个任务,其结果
将在任务完成时包含最终值。您必须通过调用asyncValue.Result
或调用asyncValue.wait()
等待此结果,然后选中asyncValue.Result
不能在控制台程序的Main
方法中使用await asyncValue
或await GetAsyncTimeFromWcf()
,因为不能将其标记为async
试试看:
Task<string> asyncValue = GetAsyncTimeFromWcf();
var time=asyncValue.Result;
Console.WriteLine(time);
Task asyncValue=GetAsyncTimeFromWcf();
var time=asyncValue.Result;
控制台写入线(时间);
@L.B您不能在main
方法中等待asyncValue
,因为它没有标记为async
,您不能将main标记为async。@user3046164:您可能会发现我的文章和博客文章很有用。@L.B您不能在main
方法中等待asyncValue
,因为它没有标记为async
>您不能将main标记为异步。@user3046164:您可能会发现我的和博客文章很有用。我现在明白了。我必须创建一个示例来学习和理解,但我被卡住了。非常感谢:)我现在明白了。我必须创建一个示例来学习和理解,但我被卡住了。非常感谢:)