当两次调用一个函数时,确保返回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的结果相同?我还有什么需要考虑的吗?

当两次调用一个函数时,确保返回C#异步任务的最佳方法是什么

您可以像这样调整服务类,以获得预期的行为。

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;
    }
}