C# 为什么一些异步方法需要返回类型的任务,而其他方法不需要';T

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

在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>. 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