Tag: multithreading

ManualResetEvent与Thread.Sleep

我实现了以下后台处理线程,其中Jobs是Queue : static void WorkThread() { while (working) { var job; lock (Jobs) { if (Jobs.Count > 0) job = Jobs.Dequeue(); } if (job == null) { Thread.Sleep(1); } else { // [snip]: Process job. } } } 这导致在输入作业和实际开始运行之间出现明显的延迟(一次性输入一批作业,每个作业只相对较小)。延迟并不是很大,但我开始考虑这个问题,并做了以下改变: static ManualResetEvent _workerWait = new ManualResetEvent(false); // … if (job == null) { lock (_workerWait) { […]

将ManualResetEvent包装为等待任务

我想等待手动重置事件,超时并观察取消。 我想出了类似下面的东西。 手动重置事件对象由我无法控制的API提供。 有没有办法在不接受和阻止ThreadPool的线程的情况下实现这一点? static Task TaskFromWaitHandle(WaitHandle mre, int timeout, CancellationToken ct) { return Task.Run(() => { bool s = WaitHandle.WaitAny(new WaitHandle[] { mre, ct.WaitHandle }, timeout) == 0; ct.ThrowIfCancellationRequested(); return s; }, ct); } // … if (await TaskFromWaitHandle(manualResetEvent, 1000, cts.Token)) { // true if event was set } else { // false if […]

通过单独的线程在表单上绘制

我正在尝试构建一个multithreading游戏,我在表单上有一个单独的线程,而不是主线程。 这给我们带来了线程安全的技术,我已经阅读了很多关于它的内容,但我不确定我是否正确使用了它。 我的问题是我有一个结构,每个数据对象都在表单上绘制它自己,所以我没有弄清楚如何实现它。 这是我工作的单线程代码的片段: public partial class Form1 : Form { GameEngine Engine; public Form1() { InitializeComponent(); Engine = new GameEngine(); } protected override void OnPaint(PaintEventArgs e) { Engine.Draw(e.Graphics); } } class GameEngine { Maze Map; List Players; public void Draw(Graphics graphics) { Map.Draw(graphics); foreach (var p in Players) { p.Draw(graphics); } } } 所以,任何人都可以给我一个提示或链接到好文章,帮助我学习如何在另一个线程上分离绘图? […]

线程与单线程

是否始终保证multithreading应用程序比单线程应用程序运行得更快? 我有两个线程从数据源填充数据但不同的实体(例如:数据库,来自两个不同的表),似乎应用程序的单线程版本比具有两个线程的版本运行得更快。 为什么会这样? 当我看一下性能监视器时,两个cpu都很spikey? 这是由于上下文切换? 掌握CPU并充分利用它的最佳做法是什么? 我希望这不是模棱两可的。

来自影响另一个线程路径的一个线程的值

我有一个程序,它使用两个客户端线程和一个服务器。 在我的程序中有一点我想在一个线程中的值来影响另一个线程的路径。 更具体地说,我在服务器中有这个代码: class Handler { public void clientInteraction(Socket connection, bool isFirstThread, Barrier barrier) { string pAnswer = string.Empty; string endGameTrigger = string.Empty; //setup streamReaders and streamWriters while(true) //infinite game loop { //read in a question and send to both threads. pAnswer = sr.ReadLine(); Console.WriteLine(pAnswer); awardPoints(); writeToConsole(“Press ENTER to ask another question or enter 0 […]

线程安全如何是NLog?

好, 我已经等了好几天才决定发布这个问题,因为我不知道如何说明这一点,重新进入一篇详细的post。 但是,我认为在这一点上要求社区提供帮助是相关的。 基本上,我尝试使用NLog为数百个线程配置记录器。 我认为这将非常简单,但我在几十秒后得到了这个exception:“ InvalidOperationException:Collection被修改;枚举操作可能无法执行 ” 这是代码。 //Launches threads that initiate loggers class ThreadManager { //(…) for (int i = 0; i<500; i++) { myWorker wk = new myWorker(); wk.RunWorkerAsync(); } internal class myWorker : : BackgroundWorker { protected override void OnDoWork(DoWorkEventArgs e) { // "Logging" is Not static – Just to eliminate this […]

并行读取和处理文件C#

我有非常大的文件,我必须阅读和处理。 这可以使用线程并行完成吗? 这是我做过的一些代码。 但它似乎不会缩短执行时间,一个接一个地读取和处理文件。 String[] files = openFileDialog1.FileNames; Parallel.ForEach(files, f => { readTraceFile(f); }); private void readTraceFile(String file) { StreamReader reader = new StreamReader(file); String line; while ((line = reader.ReadLine()) != null) { String pattern = “\\s{4,}”; foreach (String trace in Regex.Split(line, pattern)) { if (trace != String.Empty) { String[] details = Regex.Split(trace, “\\s+”); Instruction […]

如何知道谁杀了我的线程

我有一个只是放逐的线程..我想知道是谁杀了我的线程,为什么。 它发生在我的线程被操作系统杀死,但我想确认这一点,如果可能的话,知道为什么它会杀了它。 至于线程,我可以断言它在死亡前至少有40分钟的执行时间,但它突然在5分钟内死亡。 public void RunWorker() { Thread worker = new Thread(delegate() { try { DoSomethingForALongLongTime(); } catch(Exception e) { //Nothing is never logged 🙁 LogException(e); throw e; } }); worker.IsBackground = true; worker.SetApartmentState(System.Threading.ApartmentState.STA); worker.Start(); } 编辑:寻址答案 Try / Catch可能的例外情况: 它实施了,它什么都没有抓住:( 主线死亡: 该线程由Web服务器创建,该服务器继续运行 工作完成: 工作没有完成,因为它最终会影响数据库,我可以在线程死亡时检查它是否完成。 想到这些事情就把我带到了这个问题,谁杀了我的线程? PS。 在烛台的客厅里,不是Lady Goldent 🙂

在c#中multithreading处理大量Web请求

我有一个程序,我需要在外部sharepoint站点创建一些大量的文件夹(外部意思是我不能使用sharepoint对象模型)。 Web请求适用于此,但只需一次执行一个(发送请求,等待响应,重复)相当慢。 我决定multithreading化请求,试图加快速度。 该程序已大大加快,但经过一段时间(1-2分钟左右)后,并发exception开始被抛出。 代码如下,这是最好的方法吗? Semaphore Lock = new Semaphore(10, 10); List folderPathList = new List(); //folderPathList populated foreach (string folderPath in folderPathList) { Lock.WaitOne(); new Thread(delegate() { WebRequest request = WebRequest.Create(folderPath); request.Credentials = DefaultCredentials; request.Method = “MKCOL”; WebResponse response = request.GetResponse(); response.Close(); Lock.Release(); }).Start(); } for(int i = 1;i <= 10;i++) { Lock.WaitOne(); } […]

Thread.VolatileRead实现

我正在研究VolatileRead / VolatileWrite方法的实现(使用Reflector),我对此感到困惑。 这是VolatileRead的实现: [MethodImpl(MethodImplOptions.NoInlining)] public static int VolatileRead(ref int address) { int num = address; MemoryBarrier(); return num; } 为什么在读取“地址”的值后放置内存屏障? 不应该是相反的吗? (在读取值之前放置,所以对于“address”的任何挂起写入都将在我们进行实际读取时完成。同样的事情发生在VolatileWrite,其中内存屏障位于赋值之前 。为什么?另外,为什么这些方法具有NoInlining属性?如果它们被内联会发生什么?