【问题标题】:ThreadPool.QueueUserWorkItem new Form CreateHandle DeadlockThreadPool.QueueUserWorkItem 新表单 CreateHandle 死锁
【发布时间】:2010-04-27 07:15:22
【问题描述】:

我有一个线程需要创建一个弹出窗口。 我使用 ThreadPool.QueueUserWorkItem(new WaitCallback(CreatePopupinThread)) 启动线程 Thew 线程创建一个新表单。应用程序在 CreateHandle 处的新 Form 构造函数中停止工作。工作线程被锁定... 我该如何解决这个问题?

这就是我创建表单的方式

var form = new ConfirmationForm
                           {
                               Text = entry.Caption,
                               Label = entry.Text,
                           };

在构造函数中线程进入死锁

public ConfirmationForm()
        {
            InitializeComponent();
        }

【问题讨论】:

  • 建议您发布您的代码(缩减但表现出行为)
  • 避免在后台(辅助)线程中进行任何 UI 操作,它们应该在主线程中完成。这将在大多数情况下避免死锁

标签: winforms multithreading deadlock handle


【解决方案1】:

我认为最好在UI线程上创建“弹出窗口”,然后在“弹出窗口”中创建一个线程来处理你想要它做的事情。

正如我所怀疑的,您无法显示在非 ui 线程上创建的表单。
看到这个答案:Possible to construct form on background thread, then display on UI thread

【讨论】:

  • 这不是那么简单......线程实际上是一个“用户代码”。用户可以输入在运行时编译并在某些事件中运行的 c# 代码。这个“用户代码”有一些杂项方法,其中一个会弹出一条消息...
  • " 用户可以输入编译好的c#代码"...please NOOOoooo!
  • 你可以在一个新线程上创建一个表单,只要它是一个STA。
【解决方案2】:

我已经解决了这个问题... 由于在表单激活事件中完成了胎面开始,因此触发了死锁……我已将其移至 Shown 事件,现在它可以正常工作了……

【讨论】:

    猜你喜欢
    • 2015-04-03
    • 2017-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    相关资源
    最近更新 更多