AutoResetEvent vs. boolean来停止一个线程
我在工作线程中有一个对象,我可以指示该对象停止运行.我可以使用bool或autoresetevent来实现它: 布尔值: private volatile bool _isRunning; public void Run() { while (_isRunning) { doWork(); Thread.Sleep(1000); } } autoresetevent: private AutoResetEvent _stop; public void Run() { do { doWork(); } while (!_stop.WaitOne(1000)); } 然后,Stop()方法将将_isRunning设置为false,或调用_stop.Set(). 除此之外,使用Autoresetevent的解决方案可能会更快地停止,这些方法之间是否有任何区别?一个比另一个
0 2024-04-13
编程技术问答社区
.NET中的ManualResetEvent和AutoResetEvent有什么区别?
我已经阅读了有关此文档的文档,我想我理解.一个这是正确的吗? 解决方案 是.就像收费站和门之间的区别. ManualResetEvent是门,需要手动关闭(重置). AutoResetEvent是一个收费站,允许一辆汽车在下一个汽车通过之前自动关闭. 其他解决方案 只想想象AutoResetEvent执行WaitOne()和Reset()作为单个原子操作. AutoResetEvent还保证仅发布一个等待线程. 其他解决方案 简短的答案是肯定的.最重要的区别是,Autoresetevent只能允许一个等待线程继续.另一方面,手动resetevent将继续允许线程,甚至同时允许多个线程,直到告诉它停止(重置).
0 2024-04-10
编程技术问答社区
使用BackgroundWorker相继完成两个方法 WPF/C#
在我的程序中,我有两种方法需要一段时间才能完成,每个方法大约几分钟.在执行这些方法时,我在一个单独的窗口中显示一个进度栏,该窗口显示了每种方法的进度.我的两种方法是在静态实用程序中.它们看起来如下: public static class Utility { public static bool TimeConsumingMethodOne(object sender) { for (int i = 1; i
0 2024-03-27
编程技术问答社区
如何在C#中阻止代码流直到事件被触发
我在WPF应用程序中有一个带有按钮的网格.当用户单击按钮时,执行了实用程序类中的方法,该方法迫使应用程序接收单击网格.代码流必须在此处停止,并且直到用户单击网格才能继续. 我以前有一个类似的问题,我在使用异步/等待中得到答案,但是由于我将此方法用作API的一部分,所以我不想使用异步/等待,因为它需要API的消费者将它们的方法标记为异步,我不想要. 等待等待用户单击c#wpf 如何编写Utility.PickPoint(Grid grid)方法以实现此目标而不使用异步/等待?我看到了这个答案,这可能很有帮助,但我不完全了解如何将其应用于我的情况. 阻止事件完成 将其视为控制台应用程序中的Console.ReadKey()方法.当我们调用此方法时,代码流停止,直到输入一些值.在我们输入某些内容之前,调试器不会继续.我想要PickPoint()方法的确切行为.代码流将停止,直到用户单击网格.
0 2024-03-17
编程技术问答社区
AutoResetEvent不能正确阻塞
我有一个线程,该线程会创建可变数量的工作线程并在它们之间分配任务.通过将线程A taskquequeue 对象解决,您将在下面看到其实现. 这些工作线程简单地迭代了 taskqueue 对象,执行每个任务. private class TaskQueue : IEnumerable { public int Count { get { lock(this.tasks) { return this.tasks.Count; } } } private readonly Queue tasks = new Queue(); private readonly AutoResetEvent taskWaitHandle = new AutoResetEven
6 2024-01-06
编程技术问答社区
C#中的队列和等待句柄
我在申请中有以下代码多年,从未从中看到过问题. while ((PendingOrders.Count > 0) || (WaitHandle.WaitAny(CommandEventArr) != 1)) { lock (PendingOrders) { if (PendingOrders.Count > 0) { fbo = PendingOrders.Dequeue(); } else { fbo = null; } } // Do Some Work if fbo is != null } neworderevent(自动重置事件)和ExiteVent(手动重置事件)组成的Commandeventarr. ,但我不确定这是否是线程安全的(假设n个生产者线程在重新启动之前锁定了队列,并且一个运行上面代码的消
0 2024-01-05
编程技术问答社区
来自新线程的Dispatcher.Invoke正在锁定我的用户界面
我正在使用WPF,我的UI上有一个按钮. 用户单击它时,我有一个使用Autoresetevent的新线程在新线程上运行新方法的循环. 在该新线程上的该方法中,我正在使用标签,我们称其为lblstatus.我想更新该线程中不在UI上的标签.使用WPF,我必须使用dispatcher.invoke. 这是我的代码的示例: Thread thread= new Thread(StartLooking); thread.Start(); _waitHandle.WaitOne(); private void StartLooking(object value) { if (lblStatus.Dispatcher.Thread == Thread.CurrentThread) { lblStatus.Content = "Scanning>..."; } else {
4 2023-12-13
编程技术问答社区
使用AutoResetEvent等待WebBrowser DocumentCompleted
我希望我的功能等到事件WebBrowser.DocumentCompleted完成. 我正在使用AutoResetEvent,这是我的代码: private static WebBrowser _browser = new WebBrowser(); private static AutoResetEvent _ar = new AutoResetEvent(false); private bool _returnValue = false; public Actions() //constructor { _browser.DocumentCompleted += PageLoaded; } public bool MyFunction() { _browser.Navigate("https://www.somesite.org/"); _ar.WaitOne(); // wait until receiving the signal
0 2023-11-29
编程技术问答社区
C#与AutoResetEvent的线程问题
如何正确同步?目前,在e.WaitOne()完成后,SetData可能已经调用,因此d可以将其设置为另一个值.我试图插入锁,但导致僵局. AutoResetEvent e = new AutoResetEvent(false); public SetData(MyData d) { this.d=d; e.Set(); // notify that new data is available } // This runs in separate thread and waits for d to be set to a new value void Runner() { while (true) { e.WaitOne(); // waits for new data to process DoLongOperationWith_d(d); } } 最好的解决方案是引入一个新的boolean变量data
12 2023-10-20
编程技术问答社区
不稳定的应用程序使用SQLDEPDICENTINCY.几个状态和错误
我有一个使用SQLDIPPenty在分离的线程池中运行的Windows应用程序,此应用程序表示Log Monitor UI获取数据库中特定表中添加的最新行并在DataGridView中查看.您可以从此 link 中查看应用程序源代码./p> const string tableName = "OutgoingLog"; const string statusMessage = "{0} changes have occurred."; int changeCount = 0; private static DataSet dataToWatch = null; private static SqlConnection connection = null; private static SqlCommand command = null; public frmMain() { InitializeComp
12 2023-10-20
编程技术问答社区
类似于Win32复位事件的同步类,采用boost C++
我需要一些机制,让人联想到Win32重置事件,我可以通过具有waitforsingleobject()和waitgormultipleObjects()(仅需要.. singleObject()版本)的功能来检查它们.但是我正在瞄准多个平台,所以我拥有的只是boost :: threads(afaik).我想出了以下课程,想询问潜在问题以及是否取决于任务.预先感谢. class reset_event { bool flag, auto_reset; boost::condition_variable cond_var; boost::mutex mx_flag; public: reset_event(bool _auto_reset = false) : flag(false), auto_reset(_auto_reset) { } void wait() { boost::unique_lock LOCK(mx_flag)
6 2023-10-13
编程技术问答社区
new AutoResetEvent (true) 在C#中的使用情况?
我想知道, 为什么我想在AutoResetEvent的ctor中传递true? 我创建一个waitHandle,以便任何人都会呼叫WaitOne()的人实际上会等待. 如果我用true实例,它将好像立即发出信号 - 就像是正常的流动,而无需等待. EventWaitHandle _waitHandle = new AutoResetEvent (false); void Main() { new Thread (Waiter).Start(); Thread.Sleep (1000); _waitHandle.Set(); Console.ReadLine(); } void Waiter() { Console.WriteLine ("AAA"); _waitHandle.WaitOne();
54 2023-04-06
编程技术问答社区
用AutoResetEvent同步两个线程
我正在尝试实现AutoResetEvent.出于目的,我使用一个非常简单的类: public class MyThreadTest { static readonly AutoResetEvent thread1Step = new AutoResetEvent(false); static readonly AutoResetEvent thread2Step = new AutoResetEvent(false); void DisplayThread1() { while (true) { Console.WriteLine("Display Thread 1"); Thread.Sleep(1000); thread1Step.Set(); thread2Step.WaitOne(); }
20 2023-04-06
编程技术问答社区
Java相当于.Net的AutoResetEvent?
我应该用什么来获得语义等同于在Java中? (请参阅此问题 for ManualResetevent). ) 解决方案 @user249654的答案看起来很有希望.我添加了一些单元测试以验证它,实际上它可以按预期进行. 我还添加了waitOne超时的waitOne. 如果其他人发现它有用,则代码在这里: 单元测试 import org.junit.Assert; import org.junit.Test; import static java.lang.System.currentTimeMillis; /** * @author Drew Noakes http://drewnoakes.com */ public class AutoResetEventTest { @Test public void synchronisesProperly() throws InterruptedException {
40 2023-03-27
编程技术问答社区
C# 引脚垫设备的线程和事件
我是C#的新手,目前正在处理后端代码以支持引脚垫.基本上,我的代码 OpenDevice() -> RequestPIN() -> key in PIN on PIN PAD -> GetResultPIN() -> ConsolePrintOutPIN() -> Print keyed PIN on the Console 我不知道如何为此编写线程,因此一旦引脚后的" Enter键"在设备上击中,系统将自动滚动以函数GetResultPIN().因此,凭着我的基本知识,我使用Console.ReadLine()编写了以下代码以分开每个过程: static void Main(string[] args) { // 1. Open PIN Pad device OpenDevice(); Console.ReadLine();// to hold up from the previous proced
16 2023-03-06
编程技术问答社区
AutoResetEvent 设置后立即重置
考虑以下模式: private AutoResetEvent signal = new AutoResetEvent(false); private void Work() { while (true) { Thread.Sleep(5000); signal.Set(); //has a waiting thread definitely been signaled by now? signal.Reset(); } } public void WaitForNextEvent() { signal.WaitOne(); } 这种模式的目的是允许外部消费者等待某个事件(例如 - 消息到达). WaitForNextEvent未从类中调用. 举一个应该熟悉的示例,请考虑System.Diagnostics.Process.它暴露了Exited事件,但也公开了WaitForE
18 2023-02-11
编程技术问答社区
setEvent被调用而没有ResetEvent
如果使用setEvent设置手动复位事件但不使用ResetEvent复位则会发生什么情况;并且该事件被触发多次。 以下是示例任务: void foo() { ... SetEvent(hEvent1); ... } void foo1() { ... SetEvent(hEvent2); ... } int MainHandler() { ... dwEvent = WaitForMultipleObjects(2, ghEvents,//对象数组 FALSE,//等待任何对象 5000); switch(dwEvent) { case hEvent1: //做某事 break; case hEvent2: //做某事 break; } } 现在,假设hEvent1的情况正在执行仍然设置),不知何故再次触发hEvent1。我故意不把ResetEvent(hEvent1),即使它是手动
530 2022-07-17
编程技术问答社区
Java相当于.Net的AutoResetEvent?
我应该使用什么来获得等同于 AutoResetEvent 在 Java 中?(有关 ManualResetEvent,请参阅 此问题). 解决方案 @user249654 的回答看起来很有希望.我添加了一些单元测试来验证它,它确实按预期工作. 我还添加了一个需要超时的 waitOne 重载. 代码在这里,以防其他人发现它有用: 单元测试 import org.junit.Assert; import org.junit.Test; import static java.lang.System.currentTimeMillis; /** * @author Drew Noakes http://drewnoakes.com */ public class AutoResetEventTest { @Test public void synchronisesProperly() throws InterruptedException
3710 2022-07-17
编程技术问答社区