C# 为什么一些异步方法需要返回类型的任务,而其他方法不需要';T
在Microsoft提供的示例中,该方法的返回类型为C# 为什么一些异步方法需要返回类型的任务,而其他方法不需要';T,c#,asynchronous,async-await,task-parallel-library,C#,Asynchronous,Async Await,Task Parallel Library,在Microsoft提供的示例中,该方法的返回类型为Task 例1: async Task<int> AccessTheWebAsync() { // You need to add a reference to System.Net.Http to declare client. HttpClient client = new HttpClient(); // GetStringAsync returns a Task<string>. Th
Task
例1:
async Task<int> AccessTheWebAsync()
{
// You need to add a reference to System.Net.Http to declare client.
HttpClient client = new HttpClient();
// GetStringAsync returns a Task<string>. That means that when you await the
// task you'll get a string (urlContents).
Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
// You can do work here that doesn't rely on the string from GetStringAsync.
DoIndependentWork();
// The await operator suspends AccessTheWebAsync.
// - AccessTheWebAsync can't continue until getStringTask is complete.
// - Meanwhile, control returns to the caller of AccessTheWebAsync.
// - Control resumes here when getStringTask is complete.
// - The await operator then retrieves the string result from getStringTask.
string urlContents = await getStringTask;
// The return statement specifies an integer result.
// Any methods that are awaiting AccessTheWebAsync retrieve the length value.
return urlContents.Length;
}
第三,在第一个示例中,是否可以返回数组(字符串)
在第二个示例中,它使用async和await,但不返回
任务类型,为什么
他们犯了一个错误。无论何时创建一个异步且没有返回值的方法,它都应该返回一个任务
。唯一的例外是事件处理程序,您需要保持与委托签名的兼容性,但事实并非如此。将任务
视为异步方法的void
等价物
为什么您实际上想要返回一个任务
,而不是无效
?因为返回任务
可以监视执行状态,还可以正确处理封装在正在进行的操作中的任何异常
例如,考虑一个异步void
方法,该方法抛出:
public async void WaitAndThrowAsync()
{
await Task.Delay(1000);
throw new Exception("yay");
}
public void CallWaitAndThrowAsync()
{
// What happens when it throws here?
WaitAndThrowAsync();
}
当您调用它时,您无法实际处理方法内部发生的异常,这对于调用站点来说是“触发并忘记”。但是,当您公开一个任务时,您现在可以通过异步等待更好地处理该异常:
public async Task WaitAndThrowAsync()
{
await Task.Delay(1000);
throw new Exception("yay");
}
public async Task CallWaitAndThrowAsync()
{
try
{
await WaitAndThrowAsync();
}
catch (Exception e)
{
// Do something.
}
}
第三,在第一个示例中,是否可以返回
数组(字符串)
是,通过返回任务
:
公共异步任务GetArrayAsync()
{
HttpClient=新的HttpClient();
var responseStream=await client.GetStreamAsync(“http://msdn.microsoft.com");
使用(var streamReader=newstreamreader(responseStream))
{
返回wait wait streamReader.ReadToEndAsync();
}
}
当您将方法标记为async
时,编译器将隐式地为您创建任务。当您有返回类型时,生成的任务是task
,其中T
是您的返回类型
在第二个示例中,它使用async和await,但不返回
任务类型,为什么
他们犯了一个错误。无论何时创建一个异步且没有返回值的方法,它都应该返回一个任务
。唯一的例外是事件处理程序,您需要保持与委托签名的兼容性,但事实并非如此。将任务
视为异步方法的void
等价物
为什么您实际上想要返回一个任务
,而不是无效
?因为返回任务
可以监视执行状态,还可以正确处理封装在正在进行的操作中的任何异常
例如,考虑一个异步void
方法,该方法抛出:
public async void WaitAndThrowAsync()
{
await Task.Delay(1000);
throw new Exception("yay");
}
public void CallWaitAndThrowAsync()
{
// What happens when it throws here?
WaitAndThrowAsync();
}
当您调用它时,您无法实际处理方法内部发生的异常,这对于调用站点来说是“触发并忘记”。但是,当您公开一个任务时,您现在可以通过异步等待更好地处理该异常:
public async Task WaitAndThrowAsync()
{
await Task.Delay(1000);
throw new Exception("yay");
}
public async Task CallWaitAndThrowAsync()
{
try
{
await WaitAndThrowAsync();
}
catch (Exception e)
{
// Do something.
}
}
第三,在第一个示例中,是否可以返回
数组(字符串)
是,通过返回任务
:
公共异步任务GetArrayAsync()
{
HttpClient=新的HttpClient();
var responseStream=await client.GetStreamAsync(“http://msdn.microsoft.com");
使用(var streamReader=newstreamreader(responseStream))
{
返回wait wait streamReader.ReadToEndAsync();
}
}
当您将方法标记为async
时,编译器将隐式地为您创建任务。当您有返回类型时,生成的任务是任务
,其中T
是您的返回类型。第二个返回类型不符合以下条件:
返回类型是以下类型之一:
-如果方法的返回语句中的操作数类型为TResult,则为Task。
-如果您的方法没有返回语句或返回语句没有操作数,则执行任务。
-如果正在编写异步事件处理程序,则为Void(Visual Basic中的子对象)
为什么方法应该返回Task
或Task
每个返回的任务代表正在进行的工作。任务封装了有关异步进程状态的信息,并最终封装了进程的最终结果或进程在失败时引发的异常
因此,使用void
时会丢失信息。放弃实际任务进度和执行信息。因此,对于void
返回类型,使用Task
。对于任何其他类型,请使用Task
,其中T
是实际返回类型
某些方法可以返回void
,但这是禁止事件处理程序或启动程序方法返回的:
异步方法也可以是子方法(Visual Basic)或具有无效返回类型(C#)。此返回类型主要用于定义事件处理程序,其中需要void返回类型。异步事件处理程序通常作为异步程序的起点
这一秒并不是根据:
返回类型是以下类型之一:
-如果方法的返回语句中的操作数类型为TResult,则为Task。
-如果您的方法没有返回语句或返回语句没有操作数,则执行任务。
-如果正在编写异步事件处理程序,则为Void(Visual Basic中的子对象)
为什么方法应该返回Task
或Task
每个返回的任务代表正在进行的工作。任务封装了有关异步进程状态的信息,并最终封装了进程的最终结果或进程在失败时引发的异常
因此,使用void
时会丢失信息。放弃实际任务进度和执行信息。因此,对于void
返回类型,使用Task
。对于任何其他类型,请使用Task
,其中T
i