gpt4 book ai didi

wpf - 为什么我的 GUI 卡住?

转载 作者:行者123 更新时间:2023-12-01 01:02:59 25 4
gpt4 key购买 nike

我是 TPL 世界的新手,我做了以下代码:

    var myItems = myWpfDataGrid.SelectedItems;

this.Dispatcher.BeginInvoke(new Action(() =>
{
var scheduler = new LimitedConcurrencyLevelTaskScheduler(5);
TaskFactory factory = new TaskFactory(scheduler);

foreach (MyItem item in myItems)
{
Task myTask = factory.StartNew(() =>

DoLoooongWork(item)

).ContinueWith((t) =>
{
Debug.WriteLine(t.Exception.Message);
if (t.Exception.InnerException != null)
{
Debug.WriteLine(t.Exception.InnerException.Message);
}
},
TaskContinuationOptions.OnlyOnFaulted);
}
}), null);

对 gui 的唯一访问是“ var myItems = myWpfDataGrid.SelectedItems;
它是只读的!函数“DoLoooongWork()”确实可以访问串口等。它是一个独立的SDK函数,不访问GUI。我知道“Dispatcher.BeginInvoke”有点多余,但我不知道我能做什么,或者我做错了什么。此代码的唯一原因是在“DoLoooongWork()”执行时释放 GUI,但 GUI 被卡住!

那个代码有什么问题?

编辑

感谢@Euphoric 的帮助,我发现了与该帖子类似的问题:
COM Interop hang freezes entire COM system. How to cancel COM call

最佳答案

我猜里面有一些东西 DoLoooongWork需要线程关联和消息泵。试试我的 ThreadWithAffinityContext 看看是否有帮助,像这样使用它:

private async void Button_Click(object sender, EventArgs e)
{
try
{
using (var staThread = new Noseratio.ThreadAffinity.ThreadWithAffinityContext(
staThread: true, pumpMessages: true))
{
foreach (MyItem item in myItems)
{
await staThread.Run(() =>
{
DoLoooongWork(item);
}, CancellationToken.None);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

More info about ThreadWithAffinityContext .

[更新] 你在评论中提到 DoLoooongWork 里面的代码看起来像这样:
zkemkeeper.CZKEM axCZKEM1 = new zkemkeeper.CZKEM(); 
axCZKEM1.Connect_Net(ip, port);

我以前从未听说过“zkemkeeper”,但我做了一个简短的搜索,找到了 this question .显然, Connect_Net仅建立连接并启动 session ,而整个通信逻辑通过某些事件异步发生,正如该问题所暗示的:
bIsConnected = axCZKEM1.Connect_Net("192.168.0.77", Convert.ToInt32("4370"));
if (bIsConnected == true)
{
iMachineNumber = 1;
if (axCZKEM1.RegEvent(iMachineNumber, 65535))
{
this.axCZKEM1.OnFinger += new kemkeeper._IZKEMEvents_OnFingerEventHandler(axCZKEM1_OnFinger);
this.axCZKEM1.OnVerify += new zkemkeeper._IZKEMEvents_OnVerifyEventHandler(axCZKEM1_OnVerify);
// ...
}
}

那将是一个完全不同的故事。如果是这种情况并且您仍然对某些解决方案感兴趣,请发表评论。

关于wpf - 为什么我的 GUI 卡住?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21438747/

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