Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步任务等待_C#_.net_Wcf_Async Await - Fatal编程技术网

C# 异步任务等待

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 {

我试图理解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";
    }
}
[服务合同]
[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:您可能会发现我的和博客文章很有用。我现在明白了。我必须创建一个示例来学习和理解,但我被卡住了。非常感谢:)我现在明白了。我必须创建一个示例来学习和理解,但我被卡住了。非常感谢:)