将此代码转换为任务,以便在另一个线程上异步运行

本文关键字:另一个 线程 运行 异步 代码 转换 任务 | 更新日期: 2023-09-27 18:28:38

我开始玩任务和异步等待。为了更好地处理如何转换现有代码,我想我应该尝试更改当前同步运行的方法:

private bool PutFile(FileStream source, string destRemoteFilename, bool overwrite)
{
    if (string.IsNullOrEmpty(destRemoteFilename)) return false;
    string path = Path.GetDirectoryName(destRemoteFilename);
    if (path == null) return false;
    if (!Directory.Exists(path)) Directory.CreateDirectory(path);
    if (overwrite)
    {
        if (File.Exists(destRemoteFilename)) //delete file if it exists, because we are going to write a new one                 File.Delete(destRemoteFilename);
    }
    else if (File.Exists(destRemoteFilename)) return false;
    using (FileStream dest = File.OpenWrite(destRemoteFilename))
    {
        source.Seek(0, SeekOrigin.Begin);
        source.CopyTo(dest);
    }
    return true;
}

我试着简单地将方法更改为async,并尝试了Task<bool>,但我显然在这里缺少了一些东西,因为它们似乎都不起作用。我经历过Type System.Threading.Task<bool>是不可能的。

将此代码转换为任务,以便在另一个线程上异步运行

您的方法中没有调用任何异步函数,因此首先将其标记为async没有任何意义。但是,您可以使用异步版本CopyToAsync,而不是使用同步CopyTo

private static async Task<bool> PutFile(FileStream source, string destRemoteFilename, bool overwrite)
{
    if(string.IsNullOrWhiteSpace(destRemoteFilename))
        return false;
    var path = Path.GetDirectoryName(destRemoteFilename);
    if(path == null) 
        return false;
    if(!Directory.Exists(path))
        Directory.CreateDirectory(path);
    if (overwrite)
        if (!File.Exists(destRemoteFilename))
            return false;
        else
            File.Delete(destRemoteFilename);
    using (var dest = File.OpenWrite(destRemoteFilename))
    {
        source.Seek(0, SeekOrigin.Begin);
        await source.CopyToAsync(dest);
        return true;
    }
}

并且没有async/await:

private static Task<bool> PutFile(FileStream source, string destRemoteFilename, bool overwrite)
{
    if (string.IsNullOrWhiteSpace(destRemoteFilename))
        return Task.Factory.StartNew(() => false);
    var path = Path.GetDirectoryName(destRemoteFilename);
    if(path == null)
        return Task.Factory.StartNew(() => false);
    if(!Directory.Exists(path))
        Directory.CreateDirectory(path);
    if (overwrite)
        if (!File.Exists(destRemoteFilename))
            return Task.Factory.StartNew(() => false);
        else
            File.Delete(destRemoteFilename);
    using (var dest = File.OpenWrite(destRemoteFilename))
    {
        source.Seek(0, SeekOrigin.Begin);
        return source.CopyToAsync(dest).ContinueWith(x => true);
    }
}