当两次调用一个函数时,确保返回C#异步任务的最佳方法是什么
本文关键字:异步 返回 确保 任务 最佳 是什么 方法 函数 两次 调用 一个 | 更新日期: 2023-09-27 17:57:36
我截取了以下失败的代码。
public class Service
{
private int _called = 0;
public Task<int> DoAsync()
{
return Task.Run(() => Do());
}
private int Do()
{
System.Threading.Thread.Sleep(200); // fake business.
return ++_called;
}
}
public class AsyncTaskTests
{
[Test]
public async Task When_calling_async_function_twice_then_first_task_should_be_returned()
{
var sut = new Service();
var t1 = sut.DoAsync();
var t2 = sut.DoAsync();
await Task.WhenAll(t1, t2);
Assert.That(t1.Result, Is.EqualTo(1));
Assert.That(t2.Result, Is.EqualTo(1));
}
}
如何确保t1和t2的结果相同?我还有什么需要考虑的吗?
您可以像这样调整服务类,以获得预期的行为。
public class Service
{
private int _called = 0;
private Task<int> _asyncTask;
public Task<int> DoAsync()
{
if (!IsFinished)
return _asyncTask;
_asyncTask = Task.Run(() => Do());
return _asyncTask;
}
private bool IsFinished
{
get
{
return _asyncTask == null ||
_asyncTask.IsCompleted ||
_asyncTask.IsCanceled ||
_asyncTask.IsFaulted;
}
}
private int Do()
{
System.Threading.Thread.Sleep(200); // fake business.
return ++_called;
}
}