c# - 如果有条件地执行任务,异步方法应该做什么?

标签 c# async-await task

假设我有一个等待任务的方法。此方法还返回一个任务。例如:

public async virtual Task Save(String path)
{
    if (NewWords.Any())
    {
        await FileManager.WriteDictionary(path, NewWords, true);
    }
    else await Task.Run(() => { });
}

else await Task.Run(() => { });

这里有必要还是我可以随意离开它?存在/不存在有什么区别吗?也许我应该采取其他一些方法?

最佳答案

这比不必要更糟糕,因为您正在启动一个线程什么也不做,然后等待它完成什么都不做。

什么都不做最简单的方法就是什么都不做。在 async方法 该方法仍会返回一个 Task ,但是Task已经完成了,所以一些事情await进一步向上将直接进入它需要做的下一件事:

public async virtual Task Save(String path)
{
    if (NewWords.Any())
    {
        await FileManager.WriteDictionary(path, NewWords, true);
    }
}

(另外,如果这里的方法名是SaveAsyncWriteDictionaryAsync就更符合惯例了)。 如果不使用 async (这里没有必要,但我知道这是一个例子)使用 Task.CompletedTask :

public virtual Task Save(String path)
{
    if (NewWords.Any())
    {
        return FileManager.WriteDictionary(path, NewWords, true);
    }
    return Task.CompletedTask;
}

如果您针对早于 4.6 的框架进行编码,因此没有 CompletedTask可用,然后 Task.Delay(0)作为 Delay 很有用特殊情况值0返回缓存的已完成任务(实际上,与 CompletedTask 返回的任务相同):

public virtual Task Save(String path)
{
    if (NewWords.Any())
    {
        return FileManager.WriteDictionary(path, NewWords, true);
    }
    return Task.Delay(0);
}

但是 4.6 方式更清楚您的意图,而不是依赖于实现的怪癖。

关于c# - 如果有条件地执行任务,异步方法应该做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36499297/

相关文章:

c# - 使用异步和事件访问 UI 线程上的 UI 控件

gradle - Gradle Jar任务忽略doLast中的destinationDir

c# - 使用 Task[] 对象引用时未设置为对象的实例

c# - 线程间通信不杀线程

c# - 在 C# 中实现好友(在 C++ 中可用)功能

c# - 使用 async/await 执行并行任务

c# - 如何判断Task.Run是否在一个循环内完成

c# - 如何使用 textfieldParser 编辑 CSV 文件?

c# - Async-await 关键字查询

.net - 异步加载大 BitmapImage