我正在开发一个 WinForm 应用程序(使用 .NET 4.0),该应用程序有几个选项卡,其中包含有关发货的数据。当前,当用户单击选项卡时,会调用特定方法,其中所选选项卡的每个控件都填充了相关数据。
我们正在与一位外部顾问合作,他提到我们的应用程序可以从 TPL 中受益,所以我开始研究 TPL。我仍然在研究和尝试我在网上找到的小样本和教程的过程中,但我相信我已经准备好在我们现有的代码中实现 TPL。
因此,我在第一次尝试中想做的是继续在 Shipment 的初始加载时调用每个选定的选项卡加载方法,而不是等待用户单击选项卡。
在调用方法中,我有以下代码(我没有包括每个 TaskFactory 调用,因为在这个例子中会浪费空间。)
Tasks.Task.Factory.StartNew(Function() LoadSummaryTab())
Tasks.Task.Factory.StartNew(Function() LoadRouteTab())
我尝试运行代码,但遇到了跨线程问题。在研究了这个问题之后,我发现这是由于我调用的两种方法中的每一种都更新了 ui 控件。
所以我在网上找到了一些建议我使用 SyncronizationContext 的示例,但我开始怀疑我正在尝试做的事情是否值得。
使用我在网上研究的内容,我创建了一个简单的 WinForm 应用程序来测试我找到的代码。对于我正在尝试做的事情,这是否接近正确的解决方案?这成功地解决了我的跨线程问题,但显然这不像我的真实情况。
private void Form1_Load(object sender, EventArgs e)
{
var ui = TaskScheduler.FromCurrentSynchronizationContext();
var tf = Task.Factory;
var task = tf.StartNew(() =>
{
for (int i = 0; i < 100; i++)
{
Thread.Sleep(10);
};
});
task.ContinueWith(x =>
{
label1.Text = "I am label 1.";
label2.Text = "I am label 2.";
label3.Text = "I am label 3.";
label4.Text = "I am label 4.";
}, ui);
}
我在这里找到了答案 - Use Begin Invoke,但似乎我会有一些重复的代码,因为我有很多控件要更新。BeginInvoke 是我想做的最好的主意吗?
我只是想从其他有经验的开发人员那里得到反馈,他们已经走在这条路上,可以给我建议。我确实需要坚持顾问建议我们继续前进的道路,因此 TPL 需要成为主要关注点。
所以我将以这个问题结束。考虑到我提供的信息有限,尝试使用 TPL 执行所有 loadselectedtab 方法是否有意义,尤其是考虑到每个方法中都更新了几个 UI 控件?如果是这样,有人可以建议我走这条路吗?