Tag: multithreading

为什么Thread.Sleep会影响新任务的创建?

private static void Main(string[] args) { for (int i = 0; i { Thread.Sleep(1000); Console.WriteLine(“hej”); Thread.Sleep(10000); }); } Console.ReadLine(); } 为什么这段代码在一秒钟后不能打印1000次“hej”? 为什么Thread.Sleep(10000)会对代码行为产生影响?

在C#中,在两个线程之间传递数据的推荐方法是什么?

我有我的主GUI线程,第二个线程在它自己的ApplicationContext中运行(以保持它活着,即使没有工作要做)。 我想从我的GUI线程调用我的第二个线程上的方法,但是如果我只是调用thread.Method(); 它似乎在我的主GUI线程上运行并导致我的GUI无响应。 在不同线程上调用方法的最佳方法是什么? 更新:我真正想要做的是在2个线程之间进行通信,而不是与GUI通信。 GUI恰好是需要与我的第二个线程进行通信的线程之一。 更新#2:好的,我一定是错过了什么。 我创建了一个事件和一个委托,并让我的工作线程订阅了该事件。 但是当我调用Invoke(MyEvent)时; 从我的GUI线程中,工作线程最终在GUI线程上工作并挂起GUI线程直到它完成处理。 在没有轮询静态对象的情况下,我正在尝试做什么?

如何有效地异步登录?

我在我的一个项目中使用Enterprise Library 4进行日志记录(以及其他用途)。 我注意到我正在做的日志记录有一些成本,我可以通过在单独的线程上进行日志记录来减轻这种成本。 我现在这样做的方法是创建一个LogEntry对象,然后在调用Logger.Write的委托上调用BeginInvoke。 new Action(Logger.Write).BeginInvoke(le, null, null); 我真正想要做的是将日志消息添加到队列中,然后让一个线程将LogEntry实例从队列中拉出并执行日志操作。 这样做的好处是日志记录不会干扰执行操作,并且并非每个日志记录操作都会导致在线程池上抛出作业。 如何以线程安全的方式创建支持多个编写器和一个读取器的共享队列? 设计用于支持许多编写器(不会导致同步/阻塞)和单个读取器的队列实现的一些示例将非常受欢迎。 关于替代方法的建议也值得赞赏,但我对改变日志框架并不感兴趣。

易失性与易失性读/写?

我找不到任何 VolatileRead / write(尝试…)的例子,但仍然: 我什么时候应该使用volatile vs VolatileRead ? AFAIK volatile的全部目的是创造半围栏所以: 对于READ操作,在当前操作之后进行的读/写(在其他线程上)将不会在栅栏之前传递。 因此 – 我们读了最新的价值。 问题#1 那我为什么需要volatileRead呢? 似乎volatile已经完成了工作。 另外 – 在C#中, 所有写入都是易失性的 (与Java中不同),无论您是写入volatile还是非易失性字段 – 所以我问:为什么我需要volatileWrite ? 问题2 这是VolatileRead的实现: [MethodImpl(MethodImplOptions.NoInlining)] public static int VolatileRead(ref int address) { int num = address; MemoryBarrier(); return num; } 为什么行int num = address; 在那儿? 他们已经有了明确保持价值的地址参数。

multithreadingC#GUI ping示例

我想创建一个multithreadingping应用程序,我可以单击start,创建n线程同时ping多个主机,从GUI中的线程获取结果,并在用户单击取消按钮时取消所有线程。 我已经看到(很多)multithreading的方法来做到这一点,但我想有一个代码示例。 有人知道我在哪里可以找到它吗?

背景工作者永远不会停止忙碌

for (do it a bunch of times) { while (backgroundWorker1.IsBusy && backgroundWorker2.IsBusy && backgroundWorker3.IsBusy && backgroundWorker4.IsBusy && backgroundWorker5.IsBusy) { System.Threading.Thread.Sleep(0001); } if (!backgroundWorker1.IsBusy) { backgroundWorker1.RunWorkerAsync(); } else if (!backgroundWorker2.IsBusy) { backgroundWorker2.RunWorkerAsync(); } else if (!backgroundWorker3.IsBusy) { backgroundWorker3.RunWorkerAsync(); } else if (!backgroundWorker4.IsBusy) { backgroundWorker4.RunWorkerAsync(); } else if (!backgroundWorker5.IsBusy) { backgroundWorker5.RunWorkerAsync(); } } 它运行五次(每个BG工作一次)并且卡住了一会儿。 背景工作者不要再忙吗? 我该如何查询空房情况? 注意:有5个工作线程,这可以确保它们都不会停止,总是为它们分配工作。 […]

SynchronizeObject用于事件

使用Timer对象,我可以设置SynchronizingObject属性,以避免在从计时器的事件处理程序更新GUI时使用invoke。 如果我有一个类而不是订阅事件并且必须在事件处理程序中更新GUI,那么是否有类似的概念? 或者我是否必须编写InvokeRequired样板代码?

我如何在工作线程上创建和使用WebBrowser控件?

我正在创建一个应用程序,使用以下方法对网站进行屏幕截图http://pietschsoft.com/post/2008/07/C-Generate-WebPage-Thumbmail-Screenshot-Image.aspx 我试图使应用程序multithreading,但我遇到了以下错误: [ActiveX控件’8856f961-340a-11d0-a96b-00c04fd705a2’无法实例化,因为当前线程不在单线程单元中。 有任何建议如何解决这个问题? 我的代码基本如下: List lststrWebSites = new List(); lststrWebSites.Add(“http://stackoverflow.com”); lststrWebSites.Add(“http://www.cnn.com”); foreach (string strWebSite in lststrWebSites) { System.Threading.ThreadStart objThreadStart = delegate { Bitmap bmpScreen = GenerateScreenshot(strWebSite, -1, -1); bmpScreen.Save(@”C:\” + strWebSite + “.png”, System.Drawing.Imaging.ImageFormat.Png); }; new System.Threading.Thread(objThreadStart).Start(); } 从上面的URL复制GenerateScreenShot()函数实现: public Bitmap GenerateScreenshot(string url) { // This method gets a screenshot of the webpage // […]

使用“Control.CheckForIllegalCrossThreadCalls = false”是不错的主意

我有一个从serialport接收数据的类。 我使用action delegate将数据传递到文本框中显示的表单。 事情是我无法访问textbox控件,因为它说: Cross-thread operation not valid: Control accessed from a thread other than the thread it was created on 。 所以我设置Control.CheckForIllegalCrossThreadCalls = false ,它正在工作。 这样做是个好主意吗? 或者有更好的方法。 谢谢

Random.Next()有时会在不同的线程中返回相同的数字

我有以下课程 class Program { static Random _Random = new Random(); static void Main(string[] args) { … for (int i = 0; i < no_threads; ++i) { var thread = new Thread(new ThreadStart(Send)); thread.Start(); } … } static void Send() { … int device_id = _Random.Next(999999); … } } 代码创建指定数量的线程,启动每个线程,并为每个线程分配一个随机的device_id 。 出于某种原因,创建的前两个线程通常具有相同的device_id 。 我无法弄清楚为什么会这样。