Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 在等待事件时挂起线程_Vb.net_Multithreading_Event Handling - Fatal编程技术网

Vb.net 在等待事件时挂起线程

Vb.net 在等待事件时挂起线程,vb.net,multithreading,event-handling,Vb.net,Multithreading,Event Handling,我正在尝试使用一个单独的线程来处理VB.Net中的特定事件。我的想法是,如果某个特定的事件处理程序需要一段时间才能完成,我不希望主应用程序被挂起。如何让主线程循环挂起线程,同时允许它在事件发生时处理事件 当我创建Windows窗体应用程序时,有一个处理UI事件的UI线程。我不认为这个线程会不断地轮询某个变量以查看是否有人按下了按钮。我想象线程被挂起,直到操作系统告诉它有事情要做。我试图弄清楚如何确保我的事件处理程序不被UI线程执行。根据我所读到的,我可以通过从不同的线程引发事件来实现这一点。但是

我正在尝试使用一个单独的线程来处理VB.Net中的特定事件。我的想法是,如果某个特定的事件处理程序需要一段时间才能完成,我不希望主应用程序被挂起。如何让主线程循环挂起线程,同时允许它在事件发生时处理事件

当我创建Windows窗体应用程序时,有一个处理UI事件的UI线程。我不认为这个线程会不断地轮询某个变量以查看是否有人按下了按钮。我想象线程被挂起,直到操作系统告诉它有事情要做。我试图弄清楚如何确保我的事件处理程序不被UI线程执行。根据我所读到的,我可以通过从不同的线程引发事件来实现这一点。但是,当线程等待其他事件时,它会做什么呢


我想知道如何创建一个与UI线程类似的线程,它只处理我希望它处理的事件。我不确定事件在.Net中是如何工作的。我知道事件处理程序是在引发事件的线程上运行的。我相信.Net从一些线程池中分配线程来处理诸如计时器事件之类的事件。不过,我不清楚它是如何工作的,也不清楚这些线程在不处理事件时在做什么。

您可以让当前线程睡眠指定的毫秒数:

Threading.Thread.Sleep(100)
这将睡眠1/10秒

但是,如果需要在当前线程上发生排队事件,可以使用:

        Application.DoEvents()

使用DoEvents的主要问题是,您不知道实际完成了多少工作,因此根据您试图完成的内容,它可能有点不可靠。

根据您的评论,我可以看出,您想要的问题可以通过使用生产者-消费者模式得到最好的解决。使用此模式,消费线程的构造和启动方式是,它围绕循环无限旋转,等待项目出现在队列中。UI线程将使用相同的模式来实现其消息循环。下面是它的工作原理

public class DedicatedProcessingThread
{
  private BlockingCollection<object> m_Queue = new BlockingCollection<object>();

  public Consumer()
  {
    new Thread(
      () =>
      {
        while (true)
        {
          object item = m_Queue.Take(); // This blocks until an item appears.
          // Do something with item here.
        }
      }).Start();
  }

  public void Post(object item)
  {
    m_Queue.Add(item);
  }
}
公共类专用处理线程
{
private BlockingCollection m_Queue=新建BlockingCollection();
公众消费者()
{
新线程(
() =>
{
while(true)
{
object item=m_Queue.Take();//此操作将一直阻止,直到出现一个项为止。
//对这里的物品做点什么。
}
}).Start();
}
公共作废帖子(对象项)
{
m_队列。添加(项);
}
}

魔法发生在
Take
方法中。此方法旨在“挂起”(您的术语,而不是我的术语)或在队列为空时将线程状态更改为
WaitSleepJoin
。一旦一个项目排队,消费线程就会被唤醒,
Take
方法返回下一个项目。这是UI线程的消息循环中使用的常规模式,除了Windows正在发布的
System.Windows.Forms.message
值以外,它没有将普通的
object
实例排队。您可以通过发布
Delegate
实例来做类似的事情,这些实例到达后将在消费者线程上进行处理。

您的意思还不太清楚。你想“挂起”哪个线程?为什么?除了Jon说的,还有什么“事件”?你永远不想挂起你的主线程,这会导致严重的问题。在单独的线程上运行触发这些事件的代码。然后,事件处理程序也将在该独立线程上运行。要小心更新UI,你不能直接这么做。必须使用.DoEvents几乎总是一个更大问题的迹象。我同意,但肯定有它的用途。例如,如果要将焦点设置为窗体加载上的特定控件,则必须先显示窗体,然后才能将要激活的控件聚焦。DoEvents的使用实际上保证了在尝试设置focus.Me.show()应用程序之前,与.show方法相关的所有内容都已完成。DoEvents()RichTextBox1.focus()让我换一种说法。。。当我创建Windows窗体应用程序时,有一个处理UI事件的UI线程。我不认为这个线程会不断地轮询某个变量以查看是否有人按下了按钮。我想象线程被挂起,直到操作系统告诉它有事情要做。我试图弄清楚如何确保我的事件处理程序不被UI线程执行。根据我所读到的,我可以通过从不同的线程引发事件来实现这一点。但是该线程在等待其他事件时会做什么,只要退出就行了?主UI线程没有轮询任何内容。这将是非常低效的。该线程被注册以接收生成的与之相关的任何消息,并且仅在收到消息时响应。例如,当您在窗口上移动鼠标时,该线程正在接收和处理鼠标悬停事件。否则,它只是在等待处理下一条消息。如果您需要按计划执行某些操作,您可以使用计时器向线程生成自己的消息。是的,我知道主线程没有轮询任何内容。这就是我的观点。我想知道如何创建一个与UI线程类似的线程,它只处理我希望它处理的事件。我不确定事件在.Net中是如何工作的。我知道事件处理程序是在引发事件的线程上运行的。我相信.Net从一些线程池中分配线程来处理诸如计时器事件之类的事件。不过,我不清楚它是如何工作的,以及这些线程在不处理事件时在做什么。