Tag: multithreading

C#中multithreading的Lambda表达式

我试图理解为什么这个程序不起作用 预期输出:随机顺序的数字0-19运行时得到的结果:重复一些数字,有时打印20。 请帮忙。 我在DoSomething()中尝试使用lock(obj),但它没有帮助。 程序 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace ConsoleApplication2 { public delegate void callbackDelegate(int x); class Program { void processCallback(int x) { Console.WriteLine(“IN callback: The value I got is ” + x); } static void Main(string[] args) { Program p = new Program(); p.processinThreads(); Console.ReadKey(); } public […]

在.NET线程中花了多少时间?

我有一个带有(4)线程的multithreading应用程序我想知道在线程中花费了多少处理时间。 我用ThreadPool创建了所有这些线程 Thread1做job1 Thread2做job2 .. .. 结果将是: Thread1在12毫秒内运行 Thread2在20毫秒内运行 我实际上是在一个作业中下载一个网页,每个作业在一个线程中处理我想知道网页下载需要多少时间(没有其他线程上下文切换对计算时间的影响)

multithreading系统.Windows.Graphics

我当然知道我不能从不同的线程绘制到同一个Graphics对象,但是我也不能在不同的线程中绘制到不同的 Graphics对象吗? 考虑以下控制台程序: class Program { static ThreadDrawer[] drawers; static void Main(string[] args) { int numThreads = 8; drawers = new ThreadDrawer[numThreads]; for (int i = 0; i < numThreads; i++) { drawers[i] = new ThreadDrawer(); drawers[i].Start(); } for (int i = 0; i < numThreads; i++) { drawers[i].Wait(); } Console.WriteLine("Complete."); Console.ReadKey(); } class ThreadDrawer […]

将对象的引用传递给新的Thread

我有一个包含非常大的双3D数组的对象,我需要启动一个需要该数组数据的新线程,所以我需要启动一个新的线程传递该对象(其中包含很多其他数据也是新线程或我只是将3D数组传递给新线程。 对于第一个解决方案,我只需执行以下操作: MyClass { … public double[,,] _data = new double[x,y,z]; … } MyMethod(object MyObject) { //do stuff with (MyObject as MyClass) } MyClass _newObject = new MyClass(); Thread thread = new Thread(new ParameterizedThreadStart(MyMethod)); thread.Start(_newObject); 我现在的问题是:当我将对象_newObject传递给新线程时,该对象是通过引用发送到线程还是被复制的对象和新线程使用的副本? 问题是该对象包含大约300MB的数据,如果使用副本几乎是不可能的,因为我需要启动大约需要使用该对象数据的10个线程。

C#中的并行事件处理

我正在开发一个模块,它必须处理来自外部系统的许多事件。 我要使用提供事件(OnNewMessage)的第三方类将一些参数作为输入传递,将两个参数作为输出传递,每个事件需要一堆时间才能被处理。 我想以并行方式提供这些事件,以避免阻塞调用者并并行处理多个请求。 这是我的代码示例: void Init() { provider.OnNewMessage += new OnMessageEventHandler(processEvent); } void processEvent(string xml, int …, out string resultXML, out string description) { … } 在C#3.5中执行此操作的最佳方法是哪种? 谢谢

在Console中工作但在Windows窗体中不工作的异步代码

我正在尝试编写一个不断在局域网上搜索主机的应用程序。 当我将此作为控制台运行时,countdown.Wait()似乎工作正常。 但是,当我将代码带入windows窗体时,countdown.Signal()似乎没有减少它的计数器。 不确定是什么问题。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net.NetworkInformation; using System.Diagnostics; using System.Net; using System.Threading; namespace Multi_Threaded { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { PortScanner ps = new PortScanner(); […]

在C#中,等待主线程继续处理UI更新? (.NET 2.0 CF)

我想以其他方式阻止主线程上的代码执行,同时仍然允许显示UI更改。 我试图想出一个我想要做的简化示例版本; 这是我能想到的最好的。 显然它没有certificate我想要的行为,或者我不会发布这个问题。 我只是希望它提供一些代码上下文来支持我对我希望解决的问题的不良解释。 在表单上的按钮单击处理程序中,我有: private void button2_Click(object sender, EventArgs e) { AutoResetEvent autoResetEvent = new AutoResetEvent(false); new Thread(delegate() { // do something that takes a while. Thread.Sleep(1000); // Update UI w/BeginInvoke this.BeginInvoke(new ThreadStart( delegate() { this.Text = “Working… 1”; this.Refresh(); Thread.Sleep(1000); // gimme a chance to see the new text })); // do […]

WinformsmultithreadingUI操作的随机跨线程操作exception

出于某种原因,这种安全的方法引发了一个典型的例外。 跨线程操作无效:控制’statusLabel’从其创建的线程以外的线程访问。 显然,当需要调用时,此代码应通过Invoke调用匿名方法。 但每隔一段时间就会发生exception。 有没有人有类似的问题? private void SetProgressBarValue(int progressPercentage) { Action setValue = () => { var value = progressPercentage; if (progressPercentage 100) value = 100; statusProgressBar.Value = value; statusLabel.Text = string.Format(“{0}%”, value); }; if (InvokeRequired) Invoke(setValue); else setValue(); } [UPDATE2] 在实施John Saunders的建议后 ,仍然遇到了同样的错误 at System.Windows.Forms.Control.get_Handle() at System.Windows.Forms.Control.SetBoundsCore(Int32 x, Int32 y, Int32 width, Int32 height, […]

后台工作者exception处理

我对如何处理exception感到有些困惑。 我有一个后台工作线程,运行一些长时间运行的进程。 我的理解是,如果后台工作线程发生exception,代码仍将以RunWorkerCompleted方法结束。 void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Error != null) throw e.Error; 如果是这种情况,那么在bgWorker.RunWorkerAsync()周围放置一个try catch块是有意义的。 打电话,我猜不是吗? 我想重新抛出RunWorkerCompleted方法中捕获的exception,如何在不丢失堆栈跟踪的情况下执行此操作 – 我的上述内容是否正确? 我读过你,当你重新抛出exception时,你应该只使用“抛出”?

C#4.0中的障碍和C#3.0中的WaitHandle之间的区别?

我正在接受C#4.0,其中一个令我困惑的事情就是障碍概念。 这不仅仅是使用WaitHandle的WaitAll方法吗? 是不是等待所有线程完成? 我从这个页面学到了屏障结构: http : //www.managed-world.com/archive/2009/02/09/an-intro-to-barrier.aspx 但是,它看起来就像WaitAll方法。 我错过了什么? 这有什么区别? 谢谢。