"async"任务如何返回整数而不是公共整数?



我有一段不能编译的代码:

public Task<int> Handle
{
var result = <do_something_returning_an_int>();
...
return result;
}

这会导致编译器错误'不能隐式地将'int'类型转换为'System.Threading.Thread.Task'。

当我把它改成:

async Task<int> Handle
{
var result = <do_something_returning_an_int>();
...
return result;
}

…没有编译错误。

我知道async意味着任务不需要等待答案到达,但是这与类型转换有什么关系呢?

如果你在异步方法中不等待任何东西,你可以省略async关键字并返回Task而不是直接返回结果。

public Task<int> Handle
{
var result = <do_something_returning_an_int>();
...
return Task.FromResult(result);
}

据我所知,这样做只有在其他代码严格期望从您的方法获得Task时才有意义。

这当然与访问修饰符无关,您可以将asyncpublic或任何其他访问修饰符组合在一起。

我还建议看一下文档

(根据请求,从评论中推广)

这是c#语言规范中async逻辑的设计。参见Async函数一节。

你也可以阅读编程指南,Async返回类型(c#)§Task

关键是没有async关键字的方法,如
public Task<int> HandleAsync()
{
...
Task<int> result = ...;
...
return result;
}

必须返回它所说的返回值,就像所有其他类型一样。在这种情况下,您可以创建一个可以等待的Task<>,以您自己的手动方式,如:

Task<int> result = Task.Run(GetLastDigitOfSmallestTwinPrimeWithMoreThan1000000Digits);

调用者可以await你返回的任务,即使你的方法像上面那样写。

但是如果你使用async关键字,如果你的返回类型是,比如说,Task<int>,那么你必须返回一个普通的int,并且c#编译器将编写所需的逻辑给你。

通常,你会在正文的某个地方使用await(否则,为什么使用async)。比如:

public async Task<int> HandleAsync()
{
...
int result = await GetLastDigitOfSmallestTwinPrimeWithMoreThan1000000DigitsAsync();
...
return result;
}

相关问题:为什么没有必要返回一个任务当签名是公共async任务MethodName?

尝试使用任务结果,然后迭代结果

Task<int> Handle
{
return Task.Run(()=>
{
var result = <do_something_returning_an_int>();
...
return result;
}
}
List<Task<int>> tasks = new List<Task<int>>();
tasks.Add(Handle);
Task.WaitAll(tasks.ToArray());
for(int ctr = 0; ctr < tasks.Count; ctr++) {
if (tasks[ctr].Status == TaskStatus.Faulted)
output.WriteLine(" Task fault occurred");
else
{
output.WriteLine("test sent {0}",
tasks[ctr].Result);
Assert.True(true);
}
}

Task<int> Handle
{
return Task.FromResult(do_something_returning_an_int);
}

相关内容

  • 没有找到相关文章

最新更新