【发布时间】:2015-06-08 19:25:49
【问题描述】:
仍在尝试围绕 async/await 解决问题。我有以下拖放加载方法:
private async void p_DragDrop(object sender, DragEventArgs e)
{
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
List<string> CurvesToLoad = new List<string>();
List<string> TestsToLoad = new List<string>();
foreach (string file in files)
{
if (file.ToUpper().EndsWith(".CCC"))
CurvesToLoad.Add(file);
else if (file.ToUpper().EndsWith(".TTT"))
TestsToLoad.Add(file);
}
//SNIPPET IN BELOW SECTION
foreach (string CurvePath in CurvesToLoad)
{
Curve c = new Curve(CurvePath);
await Task.Run(() =>
{
c.load();
c.calculate();
});
AddCurveControls(c);
}
//END SNIPPET
foreach (string TestPath in TestsToLoad)
{
Test t = new Test(TestPath);
await Task.Run(() =>
{
t.load();
});
AddTestControls(t);
}
}
正如我预期的那样,它是非阻塞的 - 我能够在加载多个项目时在 TabControl 的选项卡之间导航,并且我可以看到每个选项卡在完成加载时弹出。
然后我尝试转换为:
private Task<Curve> LoadAndCalculateCurve(string path)
{
Curve c = new Curve(path);
c.load();
c.calculate();
return Task.FromResult(c);
}
然后将第一个代码块中标记的sn-p替换为:
foreach (string CurvePath in CurvesToLoad)
{
Curve c = await LoadAndCalculateCurve(CurvePath);
AddCurveControls(c);
}
它变成了阻塞 - 我无法在加载时浏览选项卡,然后所有加载的项目在完成后立即出现。只是想在这里学习和理解其中的差异 - 非常感谢。
编辑:
更新了 LoadAndCalculateCurve():
private async Task<Curve> LoadAndCalculateCurve(string path)
{
Curve c = new Curve(path);
await Task.Run(() => {
c.load();
c.calculate();
});
return c;
}
【问题讨论】:
-
您应该区分两种类型的任务 - IO 绑定和 CPU 绑定。它们中的每一个都有不同的性质,应该以不同的方式处理。
-
Task.FromResult返回已完成的任务,因此该部分代码(通常)不涉及其他线程。
标签: c# async-await