Tag: multithreading

如何在C#中找到运行我的线程的处理器?

如何在C#中找到运行我的线程的处理器?

MultiThreading WebBrowser控件C#STA

我想制作3个线程,每个线程运行WebBroswer控件。 所以我想使用ThreadPool让事情变得简单。 for(int i = 0;i < 3;i++) { ThreadPool.QueueUserWorkItem(new WaitCallback(gotoWork), i)); } WaitAll(waitHandles); …… / void gotoWork(object o) { string url = String.Empty; int num = (int)o; switch(num) { case 0: url = “google.com”; break; case 1: url = “yahoo.com”; break; case 2: url = “bing.com”; break; } WebBrowser w = new WebBrower(); w.Navigate(url); […]

如何引发跨线程事件

如何从另一个线程引发事件GeocodeAddressEventHandler? System.Threading.Thread MapThread; WinformMap map ; public delegate void GeocodeAddressEventHandler(object sender, EventArgs e); public event GeocodeAddressEventHandler GeocodeAddressEvent; //How to Raise this Event from another thread?? public void GeocodeAddress_Raised(object sender, EventArgs e) { MapLib.GeocodeAddress(“12798 1ST ST”, “”, “”, “”); } public bool LoadMap(string restorepoint) { ////////////////////////Engine Controls//////////////////////////////////////////////////////// try { System.ServiceModel.OperationContext context = System.ServiceModel.OperationContext.Current; //This is to […]

.NET Core Console应用程序中的重复任务

简短的版本是 – 我如何(在2017年发布.NET Core 1.1)在Microsoft Core dependency injection的 .NET Core 控制台应用程序中运行重复任务? 长篇故事和代码片段。 目标 我有4个(并且将有更多)服务,每个服务都有一个执行某个独立任务并与数据库交互的方法。 具体来说,我有一个服务从数据库中删除旧数据,一个服务“缓存”数据(在数据库中运行数据并将聚合结果存储在其他表中),一个生成随机数据等等…这个想法是以不同的间隔运行这些任务,例如每20秒或每天运行一次。 当前的脏实现 我有一个服务,每个任务有一个while(true)循环,用DI生成服务,运行任务, Thread.Sleep(interval) ,检查退出条件(类范围标志)和continue/break 。 大多数方法都是async 。 目前的问题 首先,我知道while(true)和Thread.Sleep(interval)是一个巨大的黑客(技术债务)。 其次,我有内存泄漏,我觉得我产生/处置服务的方式与它有关。 最后,代码遇到随机错误,吞下所有exception。 我无法以任何已知方式捕获它们。 我想要的解决方案 我想实现目标,但如果可能的话 避免使用像Hangfire和Quartz这样的大型框架。 我觉得我不需要他们所能做到的一小部分。 保持应用程序控制台应用 虽然这是ASP项目的“帮手”,但我希望它是一个控制台应用程序,并且能够像dotnet daemons.dll一样运行它,它会无限期地完成它的工作,直到我Ctrl+C它。 它也不应该在内存和CPU /线程消耗中增长。 只要它是一个稳定的数字,它就可以吃掉相当数量的RAM。 使用Microsoft DI。 这就是我所有服务的构建方式。 保持我的服务async 。 我可以在不同的场景中重用它们,包括unit testing。 代码片段 我如何运行重复任务的示例: private async Task RunCacheServiceAsync() { // Make sure the […]

锁定是否确保从缓存中刷新读取和写入? 如果是这样,怎么样?

我正在阅读这篇关于无锁线程同步的MSDN文章 。 这篇文章似乎推断,只要你在访问共享变量之前输入一个锁,那么这些变量将是最新的(至少在.Net 2.0中)。 我想到这是怎么可能的? .Net中的锁只是所有线程在访问内存之前检查的任意对象,但锁本身并不知道正在访问的内存位置。 如果我有一个线程更新变量,甚至整个内存块,那么当进入/退出锁时,这些更新如何保证从CPU缓存刷新? 所有内存访问是否在锁内有效地变为易失性?

Thread.MemoryBarrier和一个简单属性的锁定差异

对于以下场景,使用MemoryBarrier之间的线程安全性,结果和性能是否有任何区别 private SomeType field; public SomeType Property { get { Thread.MemoryBarrier(); SomeType result = field; Thread.MemoryBarrier(); return result; } set { Thread.MemoryBarrier(); field = value; Thread.MemoryBarrier(); } } 和lock语句( Monitor.Enter和Monitor.Exit ) private SomeType field; private readonly object syncLock = new object(); public SomeType Property { get { lock (syncLock) { return field; } } set […]

有条件地在单独的线程上运行类的方法

我有一个类将日志信息保存到数据库(在NServiceBus消息Handle方法中)。 大多数情况下,日志记录可以在主进程的单独线程(和事务)上完成。 但这一切都需要在同一个后台线程上完成(这意味着它们必须按顺序完成,而不是与主进程同步)。 但是,一旦它从NServiceBus启动Foreign Keying到实际数据,它就需要在同一个线程上。 这是一些示例代码: public class MyExample { public void LogSomeStuff(Stuff stuff) { using (MoveOutsideTransaction()) { // Do Method Stuff here dataAccess.SaveChanges(); } } public void LogSomeOtherStuff(Stuff stuff) { using (MoveOutsideTransaction()) { // Do Other Method Stuff here dataAccess.SaveChanges(); } } private IDisposable MoveOutsideTransaction() { if (loggingOutsideTransaction) return new TransactionScope(TransactionScopeOption.Suppress); return null; } […]

穿在.net中

我有一个winforms应用程序的简单示例,我在目录选择器中选择一个目录,然后单击一个按钮循环遍历目录并将目录中的每个文件复制到另一个目录中。 我想在后台线程上执行文件复制以避免锁定GUI。 我正在寻找最简单的解决方案: 创建后台线程 传递源和目的地 获取进度回调,以便我可以在GUI线程上显示进度条

最大并发节流

我希望这个问题有很多可能的解决方案,我可以自己提出一些解决方案,有些明显优于其他解决方案,但我确定无法解决这些问题是最优的,所以我很想听听那些真正的multithreading专家。 我有大约100件可以同时执行的工作,因为它们之间没有依赖关系。 如果我按顺序执行这些操作,我的总执行时间大约是1:30。 如果我在线程池中对每个工作进行排队大约需要2m,这对我来说意味着我试图一次做太多而且所有这些线程之间的上下文切换都否定了拥有这些线程的优势。 因此,基于这个假设(如果这是错误的话,请随意向我发射),如果我只排队到我系统中的核心数(这台机器上有8个),那么任何时候我都会减少上下文切换从而提高整体效率(其他流程线程当然不能承受), 任何人都可以建议这样做的最佳模式/技术吗? 顺便说一下,我使用的是smartthreadpool.codeplex.com,但我没有。

C#Threads.Abort()

如果一个线程正在运行一个函数func1 ,它调用其中的另一个函数func2 … 然后我调用了thread.Abort() 这会停止func1 或者func1和func2以及所有函数func1都调用了? 谢谢 编辑:以下是更多细节: func1在新线程中调用,它会定期连续调用func2 … func2只有在某些数组不为空时才开始做一些工作..它完成并返回 当主管想要保存数据时,它会中止Thread of func1 – 然后使数组为null,保存数据,然后用新的数据填充数组..然后再次使用func1启动Thread。 有时会引发exception,因为func2数组为空。所以func1 abort不会影响func2