C# C Windows窗体线程:我的窗体似乎不能作为自己的线程运行

C# C Windows窗体线程:我的窗体似乎不能作为自己的线程运行,c#,winforms,multithreading,C#,Winforms,Multithreading,我有一张Windows窗体。单击“确定”时,将完成一些需要一些时间的工作。在此过程中,表单的所有控件都被禁用,因此用户无法执行某些操作。除了一个按钮,中止。该按钮仍应可用于中止工艺任务。 我开始一个新的线程,好的。问题是,单击ob abort时,在线程完成后调用事件 下面是在我的按钮中启动线程的代码ok_Click event方法我在执行一些数据库操作时,使用优先级来假装线程被中止: t1 = new System.Threading.Thread(processing); t1.Priorit

我有一张Windows窗体。单击“确定”时,将完成一些需要一些时间的工作。在此过程中,表单的所有控件都被禁用,因此用户无法执行某些操作。除了一个按钮,中止。该按钮仍应可用于中止工艺任务。 我开始一个新的线程,好的。问题是,单击ob abort时,在线程完成后调用事件

下面是在我的按钮中启动线程的代码ok_Click event方法我在执行一些数据库操作时,使用优先级来假装线程被中止:

t1 = new System.Threading.Thread(processing);
t1.Priority = System.Threading.ThreadPriority.Normal;
t1.Start();
下面是我捕获中止事件的代码,但在线程工作期间无法访问该事件。使用按钮按钮或单击方法

while (t1.Priority == System.Threading.ThreadPriority.Highest)
{
    System.Threading.Thread.Sleep(1000);
}
try
{
    lock (t1)
    {
        if (t1.ThreadState != System.Threading.ThreadState.Aborted)
        {
            //abort Thread
            t1.Abort();
            //wait that lock is not released to early
            while (t1.ThreadState != System.Threading.ThreadState.Aborted) { }
        }
    }
}
希望你能帮助我。谢谢。

签出

签出

您的按钮Port\u Click事件处理程序正在旋转,将UI线程绑在一起。这就是为什么您的表单似乎没有作为自己的线程运行。您需要做的是让您的处理方法定期轮询信号以正常终止。中止线程不是一个好主意。下面是您的代码应该是什么样子

class YourForm : Form
{
  private ManualResetEvent terminate = new ManualResetEvent(false);

  private void YourThread()
  {
    while (!terminate.WaitOne(0))
    {
      // Do some more work here.
    } 
  }

  private void ButtonAbort_Click(object sender, EventArgs args)
  {
    terminate.Set();
  }
}
请注意,线程正在循环的每次迭代中调用ManualResetEvent.WaitOne以测试终止信号是否已设置。

您的ButtonPort\u Click事件处理程序正在循环中旋转,将UI线程捆绑起来。这就是为什么您的表单似乎没有作为自己的线程运行。您需要做的是让您的处理方法定期轮询信号以正常终止。中止线程不是一个好主意。下面是您的代码应该是什么样子

class YourForm : Form
{
  private ManualResetEvent terminate = new ManualResetEvent(false);

  private void YourThread()
  {
    while (!terminate.WaitOne(0))
    {
      // Do some more work here.
    } 
  }

  private void ButtonAbort_Click(object sender, EventArgs args)
  {
    terminate.Set();
  }
}

请注意,线程在循环的每次迭代中都调用ManualResetEvent.WaitOne来测试终止信号是否已设置。

这是一些非常奇怪的代码。优先级检查的目的是什么?不要执行线程。中止它会把事情搞砸。使用一个标志并在线程中检查这个标志,以便让它自己停止。这是一些非常奇怪的代码。优先级检查的目的是什么?不要执行线程。中止它会把事情搞砸。使用一个标志,并在线程中检查该标志,以使其自行停止。