Tag: autoresetevent

来自新线程的Dispatcher.Invoke正在锁定我的UI

我正在使用wpf,我的ui上有一个按钮。 当用户点击它时,我有一个使用autoresetevent在新线程上运行新方法的for循环。 在那个新线程的方法中,我正在使用一个标签,让我们称之为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 { lblStatus.Dispatcher.Invoke(DispatcherPriority.Background, new Action(() => lblStatus.Content = “Scanning>>>>>”)); } _waitHandle.Set(); } 程序就在这里停止。 它不会改变标签的内容,它会返回我的ui,但会阻止它。 我试过了 lblStatus.Dispatcher.Invoke(DispatcherPriority.Normal, new LblStatusThreadCheck(lblStatusThreadCheck), “Scanning…”); 同样,但这也不起作用。 有任何想法吗?

AutoResetEvent在Set之后立即重置

考虑以下模式: 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事件,但它也公开了一个WaitForExit方法,该方法允许调用者同步等待,直到进程退出。 这就是我想在这里实现的目标。 我需要signal.Reset()的原因是,如果一个线程在 signal.Reset()被调用之后调用signal.Reset()换句话说,如果没有线程在等待时调用.Set ),它会立即返回,如同事件已经预先发出信号。 这个问题 是否可以保证调用signal.Reset()的线程在 signal.Reset()被调用之前发出信号? 如果没有,实现WaitFor方法的其他解决方案是什么?

使用BackgroundWorker完成另一个WPF / C#之后的两个方法

在我的程序中,我有两种方法需要一段时间才能完成,每种方法大约需要几分钟。 在执行这些方法时,我在一个单独的窗口中显示一个进度条,显示每个方法的进度。 我的两个方法是在一个静态的Utility类中。 它们看起来如下: public static class Utility { public static bool TimeConsumingMethodOne(object sender) { for (int i = 1; i <= 100; i++) { Thread.Sleep(100); (sender as BackgroundWorker).ReportProgress(i); } return true; } public static bool TimeConsumingMethodTwo(object sender) { for (int i = 1; i <= 100; i++) { Thread.Sleep(50); (sender as BackgroundWorker).ReportProgress(i); } return […]

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的解决方案可能会更快停止,这些方法之间有什么区别吗? 这个比那个好吗?