我有一个场景,我需要返回一个可以从调用者那里等待的方法。
我在这里有自己的实现,我只想知道哪个是正确的。
方法1。
public class ClassA
{
public Task MyTask { get; set; }
public ClassA()
{
MyTask = MyAsyncMethod();
}
private async void MyAsyncMethod()
{
await LongProcessHere();
}
}
public class MyCaller()
{
private async void ExecuteAsync()
{
ClassA ca = new ClassA();
await ca.MyTask;
}
}
方法2。
public class ClassA
{
public Task MyAsyncMethod()
{
return Task.Run(async()=>
{
await LongProcessHere();
});
}
}
public class MyCaller()
{
private async void ExecuteAsync()
{
ClassA ca = new ClassA();
await ca.MyAsyncMethod();
}
}
答案 0 :(得分:4)
如果您要询问我应该公开一个属性或方法,那么那完全取决于Task
表示什么。
如果任务是对类的每个实例完成一次,则具有Task
属性是合适的。通常,在这种情况下,属性表示有关实例的内容,例如"my initialization is complete"或"I am done processing"。
如果任务是您需要多次执行的任务,那么使用Task
返回方法是合适的。
Task
返回方法比Task
属性更常见。
答案 1 :(得分:0)
正确的代码如下:
public class ClassA
{
// always return a Task from an async method
public async Task MyAsyncMethod()
{
await LongProcessHere();
}
}
public class MyCaller
{
private async Task ExecuteAsync()
{
ClassA ca = new ClassA();
await ca.MyAsyncMethod();
}
}
答案 2 :(得分:-1)
您不需要使用Task.Run来调用异步方法。异步方法也应该具有Task返回类型,而不是void。反之亦然。
public class ClassA
{
public async Task MyAsyncMethod()
{
return await LongProcessHere();
}
}
public class MyCaller()
{
private async Task ExecuteAsync()
{
ClassA ca = new ClassA();
await ca.MyAsyncMethod();
}
}