Tag: multithreading

如何在MSTest中处理currentDomain.UnhandledException

我尝试基于答案实现解决方案如何处理unit testing时在其他线程中引发的exception? ,但我仍然不明白在处理程序中要做什么。 我们假设我有一个测试: [TestMethod] void Test() { new Thread(() => { throw new Exception(); }).Start(); } 我有和所有测试的全局初始化: [AssemblyInitialize] public static void AssemblyInitialize(TestContext context) { AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledException += currentDomain_UnhandledException; } static void currentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { Exception ex = e.ExceptionObject as Exception; if (ex != null) Trace.WriteLine(ex); Assert.Fail(“Unhandled Exception in thread.”); […]

并行地以顺序方式执行N个线程

我有一个应用程序,我有1个大文件的1000多个小部分。 我必须一次上传最多16个零件。 我使用.Net的Thread并行库。 我使用Parallel.For来划分多个部分并分配1个应该为每个部分执行的方法,并将DegreeOfParallelism设置为16。 我需要使用由不同部分上传生成的校验和值执行1方法,因此我必须设置某些机制,我必须等待所有部件上传说1000完成。 在TPL库中,我面临的问题是它是从1000中随机执行16个线程中的任何一个。 我想要一些机制,我可以在最初运行前16个线程,如果第一个或第二个或任何16个线程完成其任务,则应该启动第17个部分。 我怎样才能做到这一点?

在C#中使用volatile(Thread.VolatileRead / Thread.VolatileWrite)

在多CP​​U机器上运行的multithreading程序中,我需要使用易失性读/写来访问共享状态(下面的示例代码中的_data)以确保正确性。 换句话说,可以在cpu上缓存堆对象吗? 使用下面的示例并假设multithreading将访问GetValue和Add方法,我需要ThreadA能够添加数据(使用Add方法)和ThreadB能够立即查看/获取添加的数据(使用GetValue方法) )。 那么我需要向_data添加易失性读/写以确保这一点吗? 基本上我不想添加要在ThreadA的cpu上缓存的数据。 /我不是锁定(强制独占线程访问),因为代码需要超快,我不从_data中删除任何数据,所以我不需要锁定_data。 谢谢。 ****更新**************************** 显然你们认为使用这个例子无锁是不好的主意。 但是我可以在这里面对哪些副作用或例外? 如果1个线程正在迭代读取值而另一个线程正在迭代更新值,那么Dictionary类型会抛出exception吗? 或者我只会遇到“脏读”(在我的情况下这会很好)? ****结束更新**************************** public sealed class Data { private volatile readonly Dictionary _data = new Dictionary(); public double GetVaule(string key) { double value; if (!_data.TryGetValue(key, out value)) { throw new ArgumentException(string.Format(“Key {0} does not exist.”, key)); } return value; } public void Add(string key, […]

使用C#lock关键字

我发布了对C#lock的理解如下,请帮我validation是否正确。 public class TestLock { private object threadLock = new object(); … public void PrintOne() { lock (threadLock) { // SectionOne } } public void PrintTwo() { lock (threadLock) { // SectionTwo } } … } 情况I> Thread1和Thread2同时尝试调用PrintOne。 由于PrintOne受到实例锁的保护,因此任何时候只有一个线程可以独占进入SectionOne。 它是否正确? 案例II> Thread1和Thread2同时分别尝试调用PrintOne和PrintTwo(即Thread1调用PrintOne和Thread2调用PrintTwo)由于两个打印方法都被同一个实例锁保护,因此任何时候只有一个线程可以独占访问SectionOne或SectionTwo ,但不是两个。 它是否正确?

multithreading与多实例 – 选择哪个?

这两种情况之间是否会有很大差异: 一个应用程序实例创建100个线程来处理一些作业 同一个应用程序的10个实例分别创建10个线程来处理作业(总计100个) 两种情况下的线程数都是相同的。 是一种表现还是一种改进? 实例 – 例如控制台应用程序,因此在第二种情况下它将运行10个控制台应用程序。 每个应用程序都有自己的文件夹。

如何通知父线程所有子线程已终止?

我有一个控制台应用程序,我正在移植到WPF。 该应用程序有3个工作线程,在将一些输出结果打印到屏幕之前,它们都连接到主线程。 我的理解是,如果我在WPF应用程序中尝试做同样的事情,GUI将被阻止,并且不会对用户产生反应。 那么如何通知父线程所有线程都已完成其工作? 我认为解决方案将涉及委托和事件(或者可能是BackgroundWorker?),但我不清楚如何在线程终止时调用回调。 原始代码: foreach (Thread t in threadList) { t.Start(); } foreach (Thread t in threadList) { t.Join(); } // print some results here

线程中的TopMost表单?

我使用以下代码在新线程中打开一个表单: private void button1_Click(object sender, EventArgs e) { Thread thread = new Thread(ThreadProc); thread.Start(); } public void ThreadProc() { Form form = new Form(); form.TopMost = true; form.ShowDialog(); } 但是,即使我将其设置为true,新创建的表单也不是TopMost。 如何在线程TopMost中创建表单?

将整数增加到65535的最佳线程安全方法

我有一个System.Timers.Timer,它每隔3秒递增一次计数器。 另一个线程也可以在某些条件下将此变量设置为任何值。 试图使用Interlocked.Increment但它没有UInt16的重载。 接下来要考虑的是锁定 ,但我不确定如何对此变量进行线程安全访问(读/写/增量)。 编辑:代码最初使用int,但按照建议更改为UInt16 private volatile System.UInt16 mCounter = 0; private readonly object mCounterLock = new object(); public System.UInt16 Counter { get { lock (mCounterLock) { return mCounter; } } set { lock (mCounterLock) { mCounter = value; } } } private System.Timers.Timer mCounterTimer; void mCounter_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { lock (mCounterLock) { […]

如何从工作线程中调用UI线程上的方法?

我正在开发一个使用以下技术的项目: C#(.NET 4.0) WCF 棱镜4 我目前正在使用代理生成的Begin / End方法对我们的一个Web服务进行异步调用。 调用成功,客户端能够在工作线程上接收Web服务的响应。 收到回复后,我继续举办活动。 订阅该事件的类继续使用PRISM请求UI导航: Application.Current.Dispatcher.BeginInvoke(new Action(() => this.RegionManager.RequestNavigate(RegionNames.LoginContentRegion, projectSelectionViewUri))); 由于未在UI线程上捕获异步WCF响应,因此我不得不使用Application.Current.Dispatcher.BeginInvoke(…)调用UI线程。 这里的问题是调用似乎什么都不做。 UI未更新,并且不会引发exception。 我应该如何从工作线程中引发的事件中调用UI线程? 编辑:此问题已在以下链接中重新询问,因为假设的副本未提供答案: 在异步WCF响应线程上使用PRISM 4请求UI导航

获取线程ID

可能重复: C#/ .NET:如何从线程中获取线程ID? 我如何获得与在Visual Studio中看到的相同的线程ID? 我曾尝试使用Thread.CurrentThread.ManagedThreadId ,但我得到了不同的数字。 我得到35,38,39等,但在Visual Studio中我有10596,893等…