1

我正在学习/尝试 Async Await 功能。我有一个调用此代码的按钮单击事件:

       //first select the direcgtory in this event.  Then called the async function..to be written
        if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
        {
            foldername = folderBrowserDialog1.SelectedPath;
        }
       // CreateFilesParellel();
        var x = CreateAsync();  

下面是函数 CreateAsync 的样子:Mode details go here

    async Task<int> CreateAsync()
    {
        string fileType;
        List<Task> tasks = new List<Task>();
        //get the files in the existing directory.
        var files = Directory.GetFiles(foldername);

        fileType = Path.GetExtension(files[0]);
        var filepath = Path.GetFullPath(files[0]);
        string d = Path.GetDirectoryName(files[0]);
        var ss = Path.GetFileNameWithoutExtension(files[0]);
        var progress = new Progress<string>();
        Stopwatch sw = new Stopwatch();
        sw.Start();
        for (int i = 0; i < 100000; i++)
        {

            Action act = () =>
            {
                File.Copy(files[0], d + "\\" + ss + i.ToString() + fileType);
            };

           //await File.Copy(files[0], d + "\\" + ss + i.ToString() + fileType);
            Task t = new Task(act);
            tasks.Add(t);
           // t.Start();
            progress.ProgressChanged += (s, e) =>
            {

                textBox1.Text = System.Environment.NewLine;
                textBox1.Text = "Creating file =  " + e;

            };
        }

        await Task.WhenAll(tasks);



        sw.Stop();
        string ExecutionTimeTaken = string.Format("Minutes :{0}\nSeconds :{1}\n Mili seconds :{2}", sw.Elapsed.Minutes, sw.Elapsed.Seconds, sw.Elapsed.TotalMilliseconds);

        MessageBox.Show(ExecutionTimeTaken);
        return 0;


    }

所以这就是问题所在。当我运行此代码时,没有任何反应。意思是文件没有被创建。我究竟做错了什么?或者我错过了什么?

4

1 回答 1

6

你永远不会开始你的Task.

通常,您应该使用Task.Run,而不是new Task,来创建(已经运行的)任务。

// Replace:
// Task t = new Task(act);
// tasks.Add(t);

// With:
tasks.Add(Task.Run(act));

话虽如此,这可能不是这种并行性(创建多个任务)的好选择。由于您正在执行纯磁盘 IO,因此您可能会收到驱动器本身的瓶颈。

您最好将此例程保留为非异步串行例程,并Task.Run在您的呼叫站点将其包装在一个单一的中:

   //first select the direcgtory in this event.  Then called the async function..to be written
    if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
    {
        foldername = folderBrowserDialog1.SelectedPath;
    }

    int result = await Task.Run(CreateFiles);
于 2013-08-15T16:31:46.007 回答