等待返回任务

有人能解释一下同步方法是什么意思吗?如果我尝试改变方法为 async然后 VS 抱怨它。

这种方法是有效的:

public Task MethodName()
{
return Task.FromResult<object>(null);
}

这样行不通:

public async Task MethodName()
{
return Task.FromResult<object>(null);
}

所以基本上我想知道这到底是什么意思: Task.FromResult<object>(null);

308896 次浏览

使用异步时,需要使用 wait 关键字,函数返回类型应该是泛型的。下面是一个返回值的例子:

public async Task<object> MethodName()
{
return await Task.FromResult<object>(null);
}

下面是一个没有返回值的例子:

public async Task MethodName()
{
await Task.CompletedTask;
}

阅读以下内容:

TPL: http://msdn.microsoft.com/en-us/library/dd460717(v=vs.110).aspx和任务: http://msdn.microsoft.com/en-us/library/system.threading.tasks(v=vs.110).aspx

异步: http://msdn.microsoft.com/en-us/library/hh156513.aspx 等待: < a href = “ http://msdn.microsoft.com/en-us/library/hh156528.aspx”rel = “ norefrer”> http://msdn.microsoft.com/en-us/library/hh156528.aspx

async方法与普通方法不同。从 async方法返回的任何内容都包装在 Task中。

如果没有返回值(void) ,它将被包装在 Task中,如果返回 int,它将被包装在 Task<int>中,以此类推。

如果您的异步方法需要返回 int,那么您应该将该方法的返回类型标记为 Task<int>,并且返回普通的 int,而不是 Task<int>。编译器将为您将 int转换为 Task<int>

private async Task<int> MethodName()
{
await SomethingAsync();
return 42;//Note we return int not Task<int> and that compiles
}

同样,当返回 Task<object>时,方法的返回类型应该是 Task<Task<object>>

public async Task<Task<object>> MethodName()
{
return Task.FromResult<object>(null);//This will compile
}

因为您的方法返回的是 Task,所以它不应该返回任何值,否则它就不会编译。

public async Task MethodName()
{
return;//This should work but return is redundant and also method is useless.
}

请记住,没有 await语句的异步方法不是 async

添加异步关键字只是为了简化状态机的创建而添加的语法糖。本质上,编译器接受你的代码;

public async Task MethodName()
{
return null;
}

然后把它变成

public Task MethodName()
{
return Task.FromResult<object>(null);
}

如果您的代码有任何 await关键字,编译器必须将您的方法转换为一个类来表示执行该方法所需的状态机。在每个 await关键字处,变量的状态和堆栈将保留在类的字段中,类将自己作为完成钩子添加到您正在等待的任务中,然后返回。

当该任务完成时,将再次执行该任务。因此,一些额外的代码被添加到方法的顶部,以恢复变量的状态并跳转到代码的下一个平台。

参见 异步等待生成什么?获得一个血淋淋的例子。

这个过程与编译器处理带有屈服语句的迭代器方法的方式有很多共同之处。

这是一个返回类型为 String 的 Task (C # 匿名函数,换句话说,委托使用“ Func”)

    public static async Task<string> MyTask()
{
//C# anonymous AsyncTask
return await Task.FromResult<string>(((Func<string>)(() =>
{
// your code here
return  "string result here";


}))());
}

为了从异步方法获得正确的响应,您需要在调用这些任务方法时放置 wait。它将等待将其转换回返回的值类型,而不是任务类型。

例如,var content = waiting StringAsyncTask (

哪里是公共异步任务 < 绳子 > StringAsyncTask ()