Tag: multithreading

即使在Monitor.Enter之后,Monitor.TryEnter也始终返回true

我想我错过了关于Monitor.Enter和Monitor.TryEnter正确行为的一些信息。 这是我编写的一段代码,用于将问题与其余代码分开: object lockObj = new object(); bool result = Monitor.TryEnter(lockObj); Console.Write(result); 结果总是true 。 这里没有惊喜。 object lockObj = new object(); Monitor.Enter(lockObj); bool result = Monitor.TryEnter(lockObj); Console.Write(result); 但这一次也是true 。 那么在Monitor.Enter之后lockObj锁定了lockObj ? 请给我一些新的看法。

在后台使用非托管库时无法更新WPF GUI

尝试使用Emgu从网络摄像头捕获图像时,我遇到了一个问题。 为了完成这项任务,Emgu使用非托管opencv库。 所以问题是我无法从System.Timers.Timer Elapsed事件更新我的GUI(WPF图像控件)。 我知道它在不同的线程中运行,但是,嘿,这就是我使用Dispatcher的原因。 这是我第一次无法使用Dispatcher。 获取InvalidOperationException,“调用线程无法访问此对象,因为另一个线程拥有它。”。 我花了一整天时间寻找解决方案,但仍无法解决问题。 任何想法为什么会发生? webcam.OnNewFrame += newBitmapSource => this.imgCaptured.Dispatcher.Invoke ( new Action(delegate { this.imgCaptured.Source = newBitmapSource; }), DispatcherPriority.Background ); Stack Trace的最后一件事是:System.Windows.Threading.Dispatcher.VerifyAccess() 但是,如果我调用Dispatcher.CheckAccess(),则返回true。 更新: 最后我自己发现了:必须在UI Thread上创建BitmapSource。 似乎它不能使用此对象。

C#异步操作

事实上,我很难理解BeginInvoke()和EndInvoke()对。 class AsynchronousDemo { public delegate void DemoDelegate(); static void Main() { DemoDelegate d = PrintA; IAsyncResult AResult = d.BeginInvoke(Callback,null); d.EndInvoke(AResult); Console.ReadKey(true); } static void PrintA() { Console.WriteLine(“….Method in Print A Running ….”); Thread.Sleep(4000); Console.WriteLine(“….Method in Print A Completed…”); } static void Callback(IAsyncResult ar) { Console.WriteLine(“I will be finished after method A completes its execution”); […]

我如何让我的方法等待所有线程完成?

我有一个方法是触发线程来做一些工作。 将有2个线程在一段时间内异步运行,并且当调用它们的回调方法时,回调将触发另一个线程,直到完成所有工作。 如何让我的方法等待所有这些线程完成并被解雇?

没有冻结替代Thread.Sleep等待在任务内部

我必须调用一个如下工作的Web API: 上传一首歌 请求对该歌曲进行特定分析 等待该过程完成 检索并返回结果 我遇到了问题。 3,我尝试过Thread.Sleep但冻结了UI。 如何在不冻结UI的情况下等待任务? public override async Task Execute(Progress progress, string id) { FileResponse upload = await Queries.FileUpload(id, FileName, progress); upload.ThrowIfUnsucessful(); FileResponse analyze = await Queries.AnalyzeTempo(id, upload); analyze.ThrowIfUnsucessful(); FileResponse status; do { status = await Queries.FileStatus(id, analyze); status.ThrowIfUnsucessful(); Thread.Sleep(TimeSpan.FromSeconds(10)); } while (status.File.Status != “ready”); AnalyzeTempoResponse response = await Queries.FileDownload(id, status); […]

IIS后台线程和SignalR

我需要有一个后台线程来做一些工作,并通过SignalR将数据发送给连接到服务的用户。 我想在IIS中托管这个线程,并在首次命中Application_Start时或在单独的工作进程中生成它。 如果我在IIS中托管它并在应用程序的开头创建它 – 该线程仅在首次点击应用程序时启动。 我一开始服务就需要它运行。 – 我无法通过桌面GUI控制此线程,我无法以简单的方式停止或暂停它。 如果我在一个单独的进程(例如Windows服务)中托管它 – 我无法访问SignalR服务实例 – 我不希望以用户身份连接到SignalR服务以向其他用户发送数据。 我想采用一种不同的方法,这并不意味着工人是SignalR本身的客户。 你对此有何看法? 你还有其他解决方案吗?

C#/ .NET – 使用最小并行化的Quicksort降低性能

我目前正在为List类进行递归并行Quicksort扩展函数。 下面的代码代表了我考虑过的最基本的线程分发标准,因为它应该是概念上最简单的解释。 它分支到检测到的处理器数量的基数2的对数深度,并从那里顺序进行。 因此,每个CPU应该获得一个具有(大致)相等,大量数据的线程来处理,避免过多的开销时间。 提供基本顺序算法用于比较。 public static class Quicksort { /// /// Helper class to hold information about when to parallelize /// /// Maximum number of supported threads /// The depth to which new threads should /// automatically be made private class ThreadInfo { internal int maxThreads; internal int threadDepth; public ThreadInfo(int length) { maxThreads […]

从另一个线程调用show后,Windows窗体窗体挂起

我的应用程序有一些异步运行的网络代码。 当没有连接到服务器时,我附加了一些要抛出的事件,当发生这种情况时,我正在创建一些“操作失败”的表单。 问题是我的表单在创建后挂起。 我读到了这个,我尝试用: public void ShowView() { if (this.InvokeRequired) { Action a = new Action(ShowView); this.Invoke(a); } else this.Show(); } 问题仍然存在。 比我发现如果没有创建控件,InvokeRequired返回false。 所以我在初始化代码中添加了: this.show(); this.hide(); 这种方式似乎有效。 但它非常难看,当我的应用程序启动时,我可以看到我的表单被显示而不是消失。 我应该如何让我的表单创建所有控件而不显示它,或者是否有更好的解决方案来解决这个问题? 编辑:更多信息。 我正在使用MVP设计模式。 我有Presenter,它依赖于IView。 我的表单实现了IView。 IView有我从我的演示者调用的ShowView()和HideVIew()方法。 我的演示者从另一个线程接收事件。 那么我应该在哪里进行这种线程跳转或者我应该如何解决这个问题? EDIT2:这里示例应用程序说明问题: public partial class Form1 : Form { Form2 form; public Form1() { InitializeComponent(); form = new Form2(); } […]

等待事情发生 – 异步或同步模型?

我有这个方法WaitForReaderArrival ,如下所示:( 等待读者到达的所有时间运行) public void WaitForReaderArrival() { do { if (ReaderArrived()) { break; } System.Threading.Thread.Sleep(1000); } while (ReaderArrived() == false); } 而我正在等待读者使用, await Task.Run(new Action(WaitForReaderArrival)); if (ReaderArrived()) { //Raise an ReaderArrived here! ..//blah blah } 我的一位同事让我改变上面这句话 WaitForReaderArrival(); if (ReaderArrived()) { //Raise an ReaderArrived here! ..//blah blah } 问题是: 我上面采用的异步模型是不是真的有用? 为什么她要我将这一行更改为正常的同步方法仍然是一个问题。 以上是等待事情发生然后继续的正确方法?

在另一个AppDomain中调用Await时没有SynchronizationContext

我已经成功构建了一个插件机制,我可以在单独的AppDomain中创建UI控件,并将它们显示为主AppDomain中Form的一部分。 这些UI控件执行自己的数据加载,因此当我打开表单时,会创建大约10个不同的插件,并且每个插件都需要加载其数据。 如果我同步执行此操作,这一切都可行,但我想在每个插件中使用async / await模式。 我的刷新方法如下所示: protected async void RefreshData() { _data = await LoadAsync(_taskId); <= UI Thread 🙂 OnDataChanged(); <= Worker Thread 🙁 } 现在开始这个问题。 当我输入这个方法时,我在主UI线程上。 但是当await结束时,我在一个工作线程上,所以我在OnDataChanged()方法中得到了一个交叉线程exception,它更新了控件。 await应该默认使用SynchronizationContext.Current来继续,但由于我在另一个AppDomain中,这恰好是NULL。 所以我的问题是。 如何配置await继续当前线程,即UI线程? 我知道我可以获取一个控件并执行Invoke(),但我也使用MVVM模式,这是在View模型中,因此我无法访问任何控件,所有View Model – > View通信都是通过数据完成的绑定。