Wad*_*gat 1 c# asynchronous async-await
我正在学习/试验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();
Run Code Online (Sandbox Code Playgroud)
以下是CreateAsync函数的样子:模式详细信息在此处
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;
}
Run Code Online (Sandbox Code Playgroud)
所以这是问题所在.当我运行此代码时没有任何反应.意义文件没有被创建.我究竟做错了什么?或者我错过了什么?
你永远不会开始你的Task
.
通常,您应该使用Task.Run
而不是new Task
创建(已经运行)任务.
// Replace:
// Task t = new Task(act);
// tasks.Add(t);
// With:
tasks.Add(Task.Run(act));
Run Code Online (Sandbox Code Playgroud)
话虽这么说,这可能不适合这种类型的并行(创建多个任务).由于您正在使用纯磁盘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);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
315 次 |
最近记录: |