Tag: multithreading

可以在后台线程上构造表单,然后在UI线程上显示

更新:只是总结一下我的问题归结为: 我希望构建.NET表单和控件不会创建任何窗口句柄 – 希望该过程被延迟到Form.Show/Form.ShowDialog 任何人都可以确认或否认这是否属实? 我有一个带有选项卡控件的大型WinForms表单,表单上有许多控件,在加载几秒钟后会暂停。 我已经将它缩小到InitializeComponent中设计器生成的代码,而不是构造函数或OnLoad中的任何逻辑。 我很清楚我不能尝试在主UI线程以外的任何线程上与UI进行交互,但我想做的是让应用程序预先加载这个表单(运行构造函数)在后台,所以只要用户想要打开它,它就可以立即在UI线程上显示。 但是,在后台线程中构建时,在设计器的这一行: this.cmbComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest; 我收到了错误 在进行OLE调用之前,必须将当前线程设置为单线程单元(STA)模式。 确保您的Main函数标记了STAThreadAttribute。 现在,这是设计器文件的一半,这让我希望通常这种策略可行。 但是这条特殊的线似乎试图立即启动某种OLE调用。 有任何想法吗? 编辑: 我想我在这里并没有说清楚。 延迟似乎发生在设计人员生成的代码期间构建bazillion控件期间。 我希望所有这些初始化代码都是在没有真正尝试触摸任何真正的Win32窗口对象的情况下发生的,因为表单尚未实际显示。 我可以设置(例如)标签文本和位置来自这个后台线程的事实让我希望这是真的。 然而,对于所有房产而言可能并非如此。

.net中的死锁示例?

任何人都可以在c#中提供一个简单的死锁示例代码吗? 请告诉您在C#代码示例中找到死锁的最简单方法。 (可能是在给定的示例代码中检测死锁的工具。) 注意:我有VS 2008

c#thread方法

如果我有 public void Method(int m) { … } 如何为此方法创建线程? 线程t =新线程((方法)); t.Start(米); 不管用。

为什么等待异步这么慢?

我终于得到了VS2012并得到了一个简单的演示,并努力检查异步的潜在性能提升并等待,但令我沮丧的是它更慢! 它可能我做错了,但也许你可以帮助我。 (我还添加了一个简单的Threaded解决方案,并且按预期运行得更快) 我的代码使用一个类来根据系统中的内核数量对数组求和(-1)我有4个内核,所以我看到了大约2倍的加速(2.5个线程)用于线程,但是减少了2倍的速度同样的事情,但使用async / await。 代码:(注意,您需要添加对System.Management的引用以使核心检测器工作) using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; using System.Management; using System.Diagnostics; namespace AsyncSum { class Program { static string Results = “”; static void Main(string[] args) { Task t = Run(); t.Wait(); Console.WriteLine(Results); Console.ReadKey(); } static async Task Run() { Random random = […]

非静态方法需要目标C#

我有一个win表单应用程序,其中列表框显示方法(按属性)。 我试图动态调用线程中的方法,使用reflection从列表框的选定值获取方法信息。 但是,当调用Methodinfo.Invoke时,我得到了这个内部exception“非静态方法需要一个目标C#”。 这是我的代码(请记住,我仍然是c#和编程的新手。) private void PopulateComboBox() {//Populates list box by getting methods with declared attributes MethodInfo[] methods = typeof(MainForm).GetMethods(); MyToken token = null; List<KeyValuePair> items = new List<KeyValuePair>(); foreach (MethodInfo method in methods) { token = Attribute.GetCustomAttribute(method, typeof(MyToken), false) as MyToken; if (token == null) continue; items.Add(new KeyValuePair( token.DisplayName, method)); } testListBox.DataSource = items; […]

C#跨线程调用问题

我正在用c#编写一个表单应用程序,我需要能够从任何线程更改Rich Text Box的内容,我尝试使用委托和InvokeRequired ,但我做的委托仍然给我一个跨线程调用错误,和InvokeRequired崩溃表单,而不会给出错误。 函数我需要能够从任何线程执行: public static void updateSub(int what) { subDisplay.subBox.Text = tb[what]; } 我试图使用的代表: public delegate void UpdateDelegateVoid(int what); static public UpdateDelegateVoid uSub = new UpdateDelegateVoid(updateSub); uSub(0); 我的InvokeRequired代码: public static void updateSub(int what) { if (subDisplay.subBox.InvokeRequired) { subDisplay.subBox.Invoke(new MethodInvoker(finish)); } else { subDisplay.subBox.Text = tb[what]; } } 我不确定为什么上面的代码不起作用。 谢谢!

在ManualResetEvent或Thread.Sleep()之间做出选择

我不确定采用哪种策略……我专注于我的操作完成,但我也想将性能问题保持在最低限度……有一种名为Execute()的方法必须等待(同步运行)直到操作完成。 此操作发生在另一个线程上。 有两种方法可以实现同样的事情…… 通过使用ManualResetEvent void Execute() { taskHandle = new ManualResetEvent(false); . . //delegate task to another thread . . taskHandle.WaitOne(); } 要么 通过使用简单的while构造 void Execute() { . . //delegate task to another thread . . while (!JobCompleted) Thread.Sleep(1000); } 我应采用两种方法中的哪一种……为什么? 编辑: Q2。 如果我在构造时只是空了怎么办? 有什么不同…? while(!JobCompleted); 编辑:(之前我收集过的东西) http://www.yoda.arachsys.com/csharp/threads/waithandles.shtml – 这篇文章说手动复制比较慢,因为它们离开了托管代码并重新进入……

使用Task.Delay()的成本是多少?

我正在考虑在具有事件驱动逻辑的MMO游戏服务器中使用C#async \ await。 让我们假设有数千个实体在已知持续时间内完成一些工作。 所以我想为每个游戏对象调用Time.Delay() 。 (这是对每个游戏对象进行一些Update()调用的常见无限循环的对立方法。) 有谁知道Task.Delay()是如何实现的? 它是否使用计时器? 系统资源是否很重? 是否可以产生数千个同时Task.Delay()调用?

将当前线程置于hibernate状态

我有一个工作单元我正在一个线程(不是主线程)。 在某些情况下,我想让这个线程睡10秒钟。 Thread.Sleep(10000)是最有效的方法吗?

.NET反向信号量?

也许现在已经太晚了,但我想不出一个很好的方法来做到这一点。 我已经开始了一堆异步下载,我想等到它们都在程序终止之前完成。 这让我相信我应该在下载开始时增加一些东西,并在它完成时减少它。 但那我怎么等到计数再次为0 ? 信号量以相反的方式工作,因为当没有可用资源时阻塞,而不是当它们全部可用时阻塞(当count为0而不是非零时为块)。