Tag: multithreading

C#在线程之间编组COM对象

我对C#marshal在线程之间是否有COM对象感到非常困惑。 为此,我有一个应用程序,它以任务并行方式加载一组文件。 我正在使用StaTaskScehduler使用COM对象加载文件。 加载COM对象后,我将对象存储在中央列表中。 然后,我再次使用STATaskScheduler尝试对此数据执行一些处理。 但是在这一点上我遇到了一个问题。 我收到如下例外情况: An unhandled exception of type ‘System.Runtime.InteropServices.InvalidComObjectException’ occurred in MadCat.exe Additional information: COM object that has been separated from its underlying RCW cannot be used 现在我的理解是我收到此错误,因为该对象尚未编组到新线程中。 我以为这是C#为你做的事情? 如何在一个线程中创建一个公寓线程COM对象,然后从另一个线程使用它? 我在这里吠叫错了吗? 我甚至不能使用Sta公寓作为我的主题吗? 我可以保证对象永远不会同时从多个线程访问。 任何想法都非常感激。 编辑 :COM对象定义如下: [ coclass, threading( apartment ), vi_progid( [Namespace.Class] ), progid( [Namespace.Class].6 ), version( 6.0 ), uuid( […]

多个线程在等待一个事件?

我想要的是AutoResetEvent的等效,多个线程可以等待,所有都在设置时恢复。 我知道这可以通过为每个线程设置一个AutoResetEvent并设置每个线程来实现 – 但是有更简单的方法吗? 一种不依赖于事件句柄数组的方法? 有效的(我认为)我希望能够做到这一点: private volatile string state; private MultiEventHandle stateChanged = new MultiEventHandle(); public void WaitForBlob() { while (true) { object saved = stateChanged.Current; // some sentinel value if (state == “Blob”) break; stateChanged.WaitTilNot(saved); // wait til sentinel value != “current” } } public void SetBlob() { state = “Blob”; stateChanged.Change(); // […]

我需要调用TcpListener.Stop()吗?

我将此代码放在一个单独的线程(Task)中,该线程在应用程序启动时首先运行,并且在应用程序关闭之前不应该结束: TcpListener tcpListener = new TcpListener(IPAddress.Any, port); tcpListener.Start(); while (true) { TcpClient client = tcpListener.AcceptTcpClient(); Task.Factory.StartNew(HandleClientCommunication, client); } 在这种情况下是否需要调用tcpListener.Stop() ? 这个线程在应用程序的整个持续时间内运行,如果我确实需要调用它,我会在哪里这样做? 侦听器是此线程的本地。 我有一个while (appRunning)循环并在FormClosing事件中将appRunning设置为false, while (true)不是有一个while (true)循环吗? 然后在while循环后我可以调用tcpListener.Stop() 。 但是,甚至需要调用TcpListener.Stop()因为应用程序已经关闭了,因为我正在使用Tasks,所以进程也会结束?

关于逻辑/算法的想法以及如何防止对SqlServer的线程写入中的竞争

我有以下逻辑: public void InQueueTable(DataTable Table) { int incomingRows = Table.Rows.Count; if (incomingRows >= RowsThreshold) { // asyncWriteRows(Table) return; } if ((RowsInMemory + incomingRows) >= RowsThreshold) { // copy and clear internal table // asyncWriteRows(copyTable) } internalTable.Merge(Table); } 这个算法有一个问题: 给定RowsThreshold = 10000 如果incomingRows将RowsInMemory放在RowsThreshold :(1)异步写出数据,(2)合并传入数据 如果incomingRows超过RowsThreshold ,则异步写入传入数据 但是如果??? 假设第二个线程旋转并调用asyncWriteRows(xxxTable); 另外,拥有异步方法的每个线程都将写入SqlServer中的同一个表: SqlServer是否将这种multithreading写入function处理到同一个表中? 跟进 根据Greg D的建议: using (SqlBulkCopy bulkCopy […]

C# – 从字典中获取时锁定资源

我有一个跟踪对象的Dictionary(ClientObject)。 字典和ClientObject都由多个线程访问。 当我修改或读取此字典中的任何对象时,我使用ReaderWriterLockSlim(rwl_clients)在字典上获取读取或写入锁定,然后获取对实际对象的独占锁定。 我只是想知道我是否正确使用这些.net线程设施 例: rwl_clients.EnterReadLock(); ClientObject clobj; if(!m_clients.TryGetValue(key, out clobj)) return; rwl_clients.ExitReadLock(); SomeMethod(clobj); SomeMethod(ClientObject clobj)会执行以下操作: lock(clobj) { /// Read / Write operations on clobj } 从一个线程中的字典中获取和锁定值(ClientObject)是否意味着其他线程将尊重该锁定? 换句话说,.net将字典中的值视为单个资源(而不是副本),因此会尊重所有线程中该资源的锁定吗? 还有一个问题,当从字典中删除资源时 – 我应该在执行Remove()之前将其锁定 例: rwl_clients.EnterWriteLock(); ClientObject clobj; if(m_clients.TryGetValue(key, out clobj)) { lock(clobj) { m_clients.Remove(key); } } rwl_clients.ExitWriteLock(); 我从这个网站上学到了很多,并感谢任何回复! 谢谢。

调用OnMessage()后自动处理BrokeredMessage

我正在尝试从Azure Service Bus排队项目,以便我可以批量处理它们。 我知道Azure Service Bus有一个ReceiveBatch()但由于以下原因似乎有问题: 我一次最多只能获得256条消息,然后根据消息大小,这可能是随机的。 即使我查看有多少消息在等待,我也不知道有多少RequestBatch调用,因为我不知道每次调用会给我多少消息。 由于消息将继续存在,我不能继续发出请求,直到它为空,因为它永远不会是空的。 我决定只使用比浪费偷看更便宜的消息监听器,并且会给我更多的控制权。 基本上我试图让一定数量的消息建立,然后立即处理它们。 我使用计时器强制延迟,但我需要能够在他们进来时对我的物品进行排队。 基于我的计时器要求,似乎阻塞集合不是一个好选项,所以我试图使用ConcurrentBag。 var batchingQueue = new ConcurrentBag(); myQueueClient.OnMessage((m) => { Console.WriteLine(“Queueing message”); batchingQueue.Add(m); }); while (true) { var sw = WaitableStopwatch.StartNew(); BrokeredMessage msg; while (batchingQueue.TryTake(out msg)) // <== Object is already disposed { …do this until I have a thousand ready to be written […]

如何在特定核心上启动线程?

我有一个四核CPU,让我说我总是希望在第二个核心上启动一个Thread 。 这可能在C#中吗?

锁定多个线程中的变量

我是C#的新手,我想询问我是否在MULTI THREADS(伪代码)中遇到这种情况: public class ClassA { ClassB c = new ClassB(); public void someMethod() { c.myVar = 1; // Some other stuff c.myVar = 0; } } public class ClassB { internal int myVar; public void MethodA() { if(myVar = 1) myVar = 0; } } 如果someMethod()和MethodA()可以在单独的线程中处于活动状态,则MethodA()可以将if语句计算为true; 但在设置myVar = 0 , someMethod()设置myVar = 0使得在MethodA()中将myVar设置为0是不正确的! 基本上,我如何锁定myVar […]

C#Parallel库,XmlReader,XmlWriter

我有一个用例,我需要: 遍历Xml文档中的每个Input节点 对每个输入执行时间密集的计算,并且 将结果写入XML文件。 输入看起来像这样: ABC123 MA Goldman BCD234 CA Goldman 和输出: ABC123 MA Goldman 75.00 Blah BCD234 CA Goldman 55.00 Ack 我想并行运行计算; 典型的输入文件可能有50,000个输入节点,没有线程的总处理时间可能是90分钟。 大约90%的处理时间花在步骤#2(计算)上。 我可以很容易地并行迭代XmlReader : static IEnumerable EnumerateAxis(XmlReader reader, string axis) { reader.MoveToContent(); while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: if (reader.Name == axis) { XElement el = XElement.ReadFrom(reader) as XElement; if […]

我是否需要使用ReaderWriterLockSlim的MemoryBarrier?

看起来单声道实现在ReaderWriterLockSlim方法中没有MemoryBarrier调用。 因此,当我在write lock内进行任何更改时,我可以在另一个使用read lock线程中接收旧的缓存值。 真的有可能吗? 我应该在读写锁定内的代码之前和之后插入MemoryBarrier吗?