在主线程陷入while循环时编辑GUI(或Task.WaitAll)

时间:2015-11-16 15:31:05

标签: c# dispose dispatcher

因此,经过长时间的诅咒和放弃希望,我得到了一切(几乎)。

我有一个GUI,显示连接的地址列表和消息列表。通常,当我关闭连接器(断开地址)时,我会写一条消息说:“与地址x断开连接”。但是正如您将从方法中看到的那样,在处理应用程序时,我无法使用调度程序来编写该消息(utf-8触发消息的写入,并从列表中直观地删除它。)

utf8

我无法使用调度程序,因为Task.WaitAll会停止该线程。如果线程停止,则调度程序无法执行this.ModuleConnections.Remove(address);,这导致任务未完成,如果任务未完成Task.WaitAll将不会释放该线程。这是一个非常大的问题。

如果没有task.waitall,我会得到大量的对象处理和密钥未找到的异常和其他令人讨厌的东西,这使得一些线程运行,因此应用程序不会完全关闭。

但是现在,当它关闭时,GUI冻结(看起来像是崩溃了)几秒钟然后(当task.waitall完成时)它关闭窗口并且整个应用程序正确关闭。

我想要的是仍然能够更新我的消息列表并显示已断开连接的地址。

只是为了澄清
我需要CloseConnector方法中的Task,因为关闭连接器(dispose)使它断开连接,它需要等到它在代码继续之前从另一端收到消息。如果我一个接一个地运行它需要几分钟,而我现在这样做只需要几秒钟。

1 个答案:

答案 0 :(得分:0)

我看到第一件事情,如果您想使用Start() menthod将它们全部调整,则不需要为您的任务调用WaitAll()方法。此外,如果您想一次运行一个任务,最好使用以Task.Run()作为参数的Expression。这种情况的不同之处在于Run()会强制您的任务立即启动,而Start()无法保证您的任务现在就会启动 - 它只是计划从TaskScheduler开始。顺便说一句,Wait()以相同的方式工作

最后,检查一下this对象 - 目前这是什么?它不是空的吗?也许尝试使用闭包并将dispatcher作为arg

希望有所帮助