Tag: multithreading

带事件通知的任务 – .net 4

昨天在SO上,我看到一个线程要求代码,其中一些是这样做的。 我的意思是,你(经理线程)使用TPL API启动任务数量,一旦完成作业,该线程应该通知你(经理)回到谁维护任务池。 所以这是我试过的代码。 虽然我必须说它的工作原理如上所述。 class TaskJob { public delegate void NotificationDelegate(int? taskId,string message); public event NotificationDelegate NotifyCompletion; public void TaskToRun() { try { if (Task.CurrentId == 4)//If its a 4th thread, simulate exception throw new Exception(); Console.WriteLine(“Task started with thread id ” + Task.CurrentId); Thread.Sleep(100000); Console.WriteLine(“Task finished with thread id ” + Task.CurrentId); NotifyCompletion(Task.CurrentId, […]

AsyncWaitHandle.WaitOne的详细信息

1)调用AsyncWaitHandle.WaitOne可能会阻止客户端或肯定会阻止客户端? 2)WaitAll,WaitOne,WaitAny之间有什么区别?

在检查取消时发送背景工作人员睡觉

我有一个后台工作者,通过ReportProgress定期更新GUI。 更新定期发生,例如每5秒一次,或者可能是20秒。 为了在设定的时间执行更新,我将工作进程发送到hibernate状态一段时间,当它唤醒时,它会使用新信息更新GUI。 工作人员支持取消,在睡觉之外取消正确。 我希望能够在等待期间调用取消,但是将线程发送到睡眠状态会使这变得不可能。 我假设我将不得不调用一个循环并检查取消作为循环的一部分来模拟线程睡眠。 实现这一目标的最佳方法是什么,我的尝试完全取消了。 long counter = 0; long sleepfor = timelinespeed*1000; int timelinespeed = 10; while (counter != sleepfor) { Thread.Sleep(1); counter++; if (bkgwk.CancellationPending) { cancelled = true; e.Cancel = true; bkgwk.Dispose(); break; } }

C#Threading:竞争条件示例

我正在阅读http://www.mono-project.com/ThreadsBeginnersGuide 。 第一个示例如下所示: public class FirstUnsyncThreads { private int i = 0; public static void Main (string[] args) { FirstUnsyncThreads myThreads = new FirstUnsyncThreads (); } public FirstUnsyncThreads () { // Creating our two threads. The ThreadStart delegate is points to // the method being run in a new thread. Thread firstRunner = new Thread […]

检测C#库中主线程的运行

我正在创建一个C#dll,它将被WinForms中的其他开发人员使用。 出于某些原因,我想检测,如果来自此库的方法是从主(GUI)线程调用并警告开发人员他已经做了这样的事情(即在日志文件中)。 有没有合理的方法来检测主线程的调用方法? 请记住,我无权访问WinForm应用程序。

在特定线程上运行工作

我想在该单独的线程中有一个特定的线程,队列用于任务和进程任务。 应用程序将根据用户使用情况制作任务,并将其排入任务队列。 然后单独的线程处理任务。 即使队列为空,保持线程处于活动状态并使用它来处理排队任务也是至关重要的。 我已经尝试了几个带有BlockingCollection的TaskScheduler实现,并将并发限制为只有一个线程,但是当队列变空并且任务由其他线程处理时,似乎线程被释放。 你能否至少向我推荐一些如何实现这一目标的消息来源? tl; dr尝试限制一个特定线程来处理动态添加到队列的任务。 EDIT1: 这是使用WCF和.NET framework 4.6的实验性Web应用程序。 在WCF库中,我尝试使用一个线程处理任务来实现此行为。 这一个线程必须使用外部dll库初始化prolog,然后使用prolog。 如果在进程中使用了其他线程,则库会抛出AccessViolationException 。 我做了一些研究,这很可能是因为该库中的线程管理不当。 我实现了我到处都有锁的工作方式。 我现在正在尝试重新实现并使其异步,因此我不会使用锁定来阻止主线程。 我不在我的电脑上,但是当我今天晚些时候回家时,我会提供一些代码。

从其他线程调用主线程中的方法

我试图在C#应用程序中同时运行3个级别的计时器,例如: T1将在应用程序的开始运行,然后在其Tick事件中,T2将启动,然后在T2的tick事件上,T3将启动。 最后,在T3的tick事件中,应该在应用程序的主线程中完成某些操作 我的问题似乎是主线程中的代码在被其他线程调用时不起作用 我应该怎么做让主线程通过其他线程的调用来运行它的函数?

单个Windows线程的内存开销是多少?

每个线程的堆栈是1 Mb吗? 或者只是CLR线程? 我想通过任务管理器了解本机Windows线程(c ++)和CLR线程作为视图的内存。 谢谢

检测ThreadPool WorkItem是否已完成/等待完成

无论出于何种原因, ThreadPool的QueueWorkItem不会返回IAsyncResult或工作项的其他句柄,这将允许等到它完成。 有RegisterWait…方法,但是你必须传递一个WaitHandle并且创建它们很昂贵(参见IAsyncResult文档,它建议你在请求之前延迟创建WaitHandle )。 任务并行库将解决这个缺陷,但在可用之前需要等待很长时间。 那么,这个设计有什么问题: public class Concurrent { private ManualResetEvent _resetEvent; private T _result; public Concurrent(Func f) { ThreadPool.QueueUserWorkItem(_ => { _result = f(); if (_resetEvent != null) _resetEvent.Set(); }); } public WaitHandle WaitHandle { get { if (_resetEvent == null) _resetEvent = new ManualResetEvent(_result != null); return _resetEvent; } … 编辑:我问了一个关于使用异步委托而不是ThreadPool时出现的问题的后续问题 。

从另一个线程启动时,我的表单无法正确显示

情况就是这样:我正在开发一个具有以下结构的简单应用程序: FormMain(启动点) FormNotification CompleFunctions 对? 好吧,在FormMain中我有以下function: private void DoItInNewThread(ParameterizedThreadStart pParameterizedThreadStart, object pParameters, ThreadPriority pThreadPriority) { Thread oThread = new Thread(pParameterizedThreadStart); oThread.CurrentUICulture = Settings.Instance.Language; oThread.IsBackground = true; oThread.Priority = pThreadPriority; oThread.Name = “μRemote: Background operation”; oThread.Start(pParameters); } 因此,每次我需要调用位于ComplexFunctions上的耗时方法时,我会执行以下操作: // This is FormMain.cs string strSomeParameter = “lala”; DoItInNewThread(new ParameterizedThreadStart(ComplexFunctions.DoSomething), strSomeParameter, ThreadPriority.Normal); 另一个类FormNotification,它是一个向用户显示进程信息的表单。 可以从FormMain或ComplexFunctions调用此FormNotification。 例: // This is […]