gpt4 book ai didi

c# - Task.StartNew 在运行时持有主线程

转载 作者:太空宇宙 更新时间:2023-11-03 21:52:52 25 4
gpt4 key购买 nike

当这段代码运行时,我无法在我的 UI 中移动或做任何事情:

var a = txtLot.Text;
var b = cmbMcu.SelectedItem.ToString();
var c = cmbLocn.SelectedItem.ToString();

var itm = Task<JDEItemLotAvailability>
.Factory.StartNew(() =>
{
btnCheck.BackColor = Color.Red;
var ret = Dal.GetLotAvailabilityF41021(a, b, c);
btnCheck.BackColor = Color.Transparent;
return ret;
}
);
lblDescriptionValue.Text = itm.Result.Description;
lblItemCodeValue.Text = itm.Result.Code;
lblQuantityValue.Text = itm.Result.AvailableQuantity.ToString();

我尝试对 Dal 方法的调用发表评论并改用 thread.sleep(5000) 但我仍然无法移动表单。

编辑:也许我使用了错误的方法来取回结果?

更新:

在第一个回复(John 的)之后我尝试了这个:

var a = txtLot.Text;
var b = cmbMcu.SelectedItem.ToString();
var c = cmbLocn.SelectedItem.ToString();

var itm = Task<JDEItemLotAvailability>
.Factory.StartNew(() =>
{
btnCheck.BackColor = Color.Red;
var ret = Dal.GetLotAvailabilityF41021(a, b, c);
btnCheck.BackColor = Color.Transparent;
return ret;
}
).ContinueWith(itm =>
{
lblDescriptionValue.Text = itm.Result.Description;
lblItemCodeValue.Text = itm.Result.Code;
lblQuantityValue.Text = itm.Result.AvailableQuantity.ToString();
});

但当然我又在搞乱 ui ....表单卡住消失了,但是当任务完成时发生了异常

最佳答案

这里有两个问题。

首先,您的代码试图从几乎可以肯定是不同线程的线程访问 UI 线程(即在任务中,它可能会在线程池线程中执行)。你不应该那样做。

其次,您在这里阻塞了 UI 线程:

lblDescriptionValue.Text = itm.Result.Description;

itm.Result 属性的访问将阻塞,直到任务完成。您不想这样做 - 这次 在 UI 线程中 - 因为这会卡住您的 UI,正如您所观察到的那样。

如果您使用的是 C# 5 和 .NET 4.5,您可以尝试使用新的异步功能 - 这可能会让您更容易地做您想做的事情。

如果您不能使用 .NET 4.5(或 .NET 4 的异步目标包),您应该使用 Task.ContinueWith 告诉 Task 您想要什么完成后去做。

编辑:我怀疑你想要这样的东西:

var a = txtLot.Text;
var b = cmbMcu.SelectedItem.ToString();
var c = cmbLocn.SelectedItem.ToString();

btnCheck.BackColor = Color.Red;
var task = Task.Factory.StartNew(() => Dal.GetLotAvailabilityF41021(a, b, c));
task.ContinueWith(t =>
{
btnCheck.BackColor = Color.Transparent;
lblDescriptionValue.Text = t.Result.Description;
lblItemCodeValue.Text = t.Result.Code;
lblQuantityValue.Text = t.Result.AvailableQuantity.ToString();
}, TaskScheduler.FromCurrentSynchronizationContext());

关于c# - Task.StartNew 在运行时持有主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13673657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com