是否可以在不等待结果的情况下"启动"(大)文件的副本?

Flo*_*ian 3 c# asynchronous xcopy task-parallel-library

我认为这在标题中非常明显; 我想复制文件而不等待结果.

我想要这个:

    static void Main(string[] args)
    {
        string strCmdText = @"/C xcopy c:\users\florian\desktop\mytestfile.fil p:\";
        System.Diagnostics.Process.Start("CMD.exe", strCmdText);
        Console.WriteLine("Finished !");
    }
Run Code Online (Sandbox Code Playgroud)

基本上我的主线程在几毫秒后释放.我尝试这样做:

    static void Main(string[] args)
    {
        var t = Task.Run(() => Copy(@"c:\Users\florian\Desktop\mytestfile.fil", "p:"));
    }

    private static void Copy(string source, string destination)
    {
        using (FileStream SourceStream = File.Open(source, FileMode.Open))
        {
            using (FileStream DestinationStream = File.Create(destination + source.Substring(source.LastIndexOf('\\'))))
            {
                SourceStream.CopyToAsync(DestinationStream);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的mytestfile.fil是在我的目标文件夹中创建的,但其大小为0kb.

问候,

mm8*_*mm8 5

基本上我的主线程在几毫秒后释放.我试着这样做

你必须以某种方式让这个过程保持活力.最简单的方法 - 如果你真的必须在自己的线程上进行文件复制 - 就是在前台线程上执行你的Copy方法:

class Program
{
    static void Main(string[] args)
    {
        System.Threading.Thread thread = new System.Threading.Thread(()=> Copy(@"c:\Users\florian\Desktop\mytestfile.fil", "p:"));
        thread.Start();
    }

    private static void Copy(string source, string destination)
    {
        using (FileStream SourceStream = File.Open(source, FileMode.Open))
        {
            using (FileStream DestinationStream = File.Create(destination + source.Substring(source.LastIndexOf('\\'))))
            {
                SourceStream.CopyTo(DestinationStream);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

...或者您可以在主线程上执行它,因为您的应用程序似乎没有其他任何东西:

class Program
{
    static void Main(string[] args)
    {
        string source = @"c:\Users\florian\Desktop\mytestfile.fil";
        string destination = "p";
        using (FileStream SourceStream = File.Open(source, FileMode.Open))
        {
            using (FileStream DestinationStream = File.Create(destination + source.Substring(source.LastIndexOf('\\'))))
            {
                SourceStream.CopyTo(DestinationStream);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

第三个选项是使您的方法异步并等待它在Main方法中同步完成:

class Program
{
    static void Main(string[] args)
    {
        CopyAsync(@"c:\Users\florian\Desktop\mytestfile.fil", "p:").Wait();
    }

    private static async Task CopyAsync(string source, string destination)
    {
        using (FileStream SourceStream = File.Open(source, FileMode.Open))
        {
            using (FileStream DestinationStream = File.Create(destination + source.Substring(source.LastIndexOf('\\'))))
            {
                await SourceStream.CopyToAsync(DestinationStream);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,除非您实际等待它,否则不应使用异步CopyToAsync方法.不要混用同步和异步代码:)