Tag: multithreading

为什么BackgroundWorker在此unit testing中没有在正确的线程上调用RunWorkerCompleted?

backgroundWorker的重点是在耗时的任务之后更新UI。 该组件的工作方式与我的WPF应用程序中的广告相同 。 但是在我的测试中,调用线程上没有调用回调。 [Test] public void TestCallbackIsInvokedOnClientThread() { var clientId = Thread.CurrentThread.ManagedThreadId; int callbackThreadId = -1; var manualEvent = new ManualResetEventSlim(false); var someUIControl = new TextBox(); var bw = new BackgroundWorker(); bw.DoWork += (s,e) => e.Result = 5 ; // worker thread bw.RunWorkerCompleted += (s, e) => { try { callbackThreadId = Thread.CurrentThread.ManagedThreadId; //someUIControl.Text […]

如何在c#中指定的时间后取消后台工作程序

如何在c#中指定时间后取消后台工作程序或取消不响应后台工作程序。

ThreadStateException:尝试加入线程时尚未启动Thread

就在最近,我在面试时遇到了这样一个问题 什么是methid’计算’执行的输出: public void Calculate() { var threads = Enumerable.Range(0, 50).Select(x => { var thread = new Thread(DoWork) { Name = x.ToString() }; return thread; }); foreach (var thread in threads) { thread.Start(); } foreach (var thread in threads) { thread.Join(); } } private void DoWork() { Console.WriteLine(“Start()”); } 我在VS中检查了它,并且惊讶于线程’thread.Join();’上抛出了ThreadStateException。 使用调试器我发现该线程未启动。 似乎当我们经历第二个foreach时,我们处理另一个线程集合。 任何人都可以详细解释为什么抛出exception? 提前致谢!

等待任何线程完成,而不是全部

我正在启动多个线程,想知道什么时候结束。 我知道以下代码: foreach (Thread t in threads) t.Join(); 但它只会等待所有线程在一起。 那太晚了。 我需要知道一个线程何时完成,即使其他线程仍在运行。 我正在为线程寻找等同于WaitAny东西。 但我无法将代码添加到我正在监视的所有线程中,因此使用信号或其他同步对象不是一种选择。 一些澄清:我正在开发一个记录/跟踪工具,它应该记录应用程序的活动。 我可以在线程启动时插入日志语句,但是我不能在线程的每个可能的方式上插入日志语句(多个出口点,exception等)。 所以我想注册新线程,然后在完成写入日志条目时收到通知。 我可以异步Join每个线程,但这意味着每个受监控线程的第二个线程可能看起来有点开销。 线程通过各种方式使用,无论是BackgroundWorker , Task还是池线程。 从本质上讲,它是一个线程,我想知道它什么时候完成。 确切的线程机制由应用程序定义,而不是日志记录解决方案。

如何在不阻止UI的情况下使用WebClient?

有人可以指向我一个教程或提供一些示例代码来调用System.Net.WebClient().DownloadString(url)方法,而不会在等待结果时冻结UI吗? 我认为这需要用线程来完成? 是否有一个简单的实现我可以使用没有太多的开销代码? 谢谢! 实现了DownloadStringAsync,但UI仍然处于冻结状态。 有任何想法吗? public void remoteFetch() { WebClient client = new WebClient(); // Specify that the DownloadStringCallback2 method gets called // when the download completes. client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(remoteFetchCallback); client.DownloadStringAsync(new Uri(“http://www.google.com”)); } public void remoteFetchCallback(Object sender, DownloadStringCompletedEventArgs e) { // If the request was not canceled and did not throw // an […]

Task.Run继续在同一个线程上导致死锁

考虑以下我将要同步等待的异步方法。 等一下,我知道。 我知道它被认为是不好的做法并导致死锁 ,但我完全意识到这一点并采取措施通过使用Task.Run包装代码来防止死锁。 private async Task BadAssAsync() { HttpClient client = new HttpClient(); WriteInfo(“BEFORE AWAIT”); var response = await client.GetAsync(“http://google.com”); WriteInfo(“AFTER AWAIT”); string content = await response.Content.ReadAsStringAsync(); WriteInfo(“AFTER SECOND AWAIT”); return content; } 这个代码肯定会死锁(在具有SyncronizationContext的环境中,如在ASP.NET之类的单个线程上调度任务),如果这样调用: BadAssAsync().Result 。 我面临的问题是即使使用这种“安全”包装器,它仍然偶尔会出现死锁。 private T Wait1(Func<Task> taskGen) { return Task.Run(() => { WriteInfo(“RUN”); var task = taskGen(); return task.Result; }).Result; […]

WaitAll和done事件的线程问题 – 信号触发exception

我正在使用线程池(毫不奇怪)管理一组线程。 我要做的是让他们在完成后发出信号,我有: ManualResetEvent[] doneEvents = new ManualResetEvent[char_set.Length]; public struct string_char { public string[] _str_char; public ManualResetEvent _doneEvent; public string_char(string[] str_char, ManualResetEvent doneEvent) { _str_char = str_char; _doneEvent = doneEvent; } } 我有一个循环,创建一个char数组,然后我创建一个我的struct实例填充char数组和一个完成事件: doneEvents[no_of_elements – 1] = new ManualResetEvent(false); string_char s_c = new string_char(array_holder, doneEvents[no_of_elements – 1]); ThreadPool.QueueUserWorkItem(ThreadPoolCallback, s_c); 因此,线程被创建,添加到池中,并且它快速地运行并运行,当它完成时它设置完成事件: public void ThreadPoolCallback(Object s_c) { string_char […]

如何冻结无法冻结的freezable对象

在我的场景中,我想在我想在后台任务中渲染它之前冻结一个不变的BitmapCacheBrush。 不幸的是我收到错误“这个Freezable不能被冻结”。 是否有任何解决方法或hacky方式冻结也不是freezable对象? 也许可以通过reflection设置正确的属性来达到这个目标? 提前谢谢你们。 编辑:(我的示例代码请求) public static class ext { public static async Task RenderAsync(this Visual visual) { var bounds = VisualTreeHelper.GetDescendantBounds(visual); var bitmapCacheBrush = new BitmapCacheBrush(visual); bitmapCacheBrush.BitmapCache = new BitmapCache(); // We need to disconnect the visual here to make the freezable freezable :). Of course this will make our rendering blank //bitmapCacheBrush.Target […]

我必须向我的Web API REST方法添加显式线程吗?

我创建了一些将由掌上电脑/ Windows CE客户端调用的Web API REST方法。 因此,服务器可能同时受到多个(好的,更像是它,问题是多少)请求。 REST方法是否自动处理这个问题,还是我必须明确添加线程代码,以便一个客户端的请求不会干扰其他人?

如何确保Task.Delay更准确?

我有一个WPF应用程序,它广泛使用await和async方法。 有几个地方我叫await Task.Delay(…); 插入暂停。 但是我遇到的麻烦是虽然很多这些停顿都可以稍微偏离,但有些地方我绝对需要暂停才能准确。 换句话说,如果我调用await Task.Delay(2000); 在我的应用程序中有一些地方我需要保证它只会暂停2秒(而不是2.2秒)。 我相信问题来自于我确实有很多不同的异步方法,所以当我告诉其中一个延迟时,线程池中没有足够的线程,当它应该恢复活着时,结果,无意中,延迟比预期的更长。 当您的业务需要尽可能准确地延迟时,线程的C#“最佳实践”是什么? 很明显,异步方法似乎并不足够(即使它们很好阅读)。 我应该手动创建具有更高优先级的线程并使用Thread.Sleep吗? 我是否增加了线程池中的线程数? 我使用BackgroundWorker吗?