Tag: multithreading

WCT GetThreadWaitChain调用allways返回false

我试图获取有关某些线程的WCT信息,但每次调用GetThreadWaitChain函数时,我都会得到错误的响应,并且ref参数保持为零。 我究竟做错了什么? 我在一个调用WaitForMultipleObjects的线程上调用此函数,我确保在调试时此线程等待。 那是我的代码: internal void CollectWaitInformation(ClrThread thread) { var g_WctHandle = OpenThreadWaitChainSession(0, 0); uint threadID = thread.OSThreadId; WAITCHAIN_NODE_INFO[] NodeInfoArray = new WAITCHAIN_NODE_INFO[WCT_MAX_NODE_COUNT]; int isCycle = 0; int count = 0; // Make a synchronous WCT call to retrieve the wait chain. bool result = GetThreadWaitChain(g_WctHandle, IntPtr.Zero, WCTP_GETINFO_ALL_FLAGS, threadID, ref count, NodeInfoArray, out isCycle); if […]

如何在C#Winform中锁定应用程序GUI

可能重复: 如何在后台线程运行时阻止Winforms UI 我正在使用C#WinForm应用程序 我在屏幕上有一个Save按钮,屏幕数据保存到数据库中。 当用户点击按钮应用程序进入数据库并保存数据时会发生什么。 这需要一些时间。 但是,如果用户再次单击“保存”按钮,则会触发Click事件,当第一次单击返回主代码(保存数据库后)时,捕获的事件将被触发。 简而言之,当线程从第一个事件返回时,会捕获并触发click事件(我尝试了启用/禁用按钮的方案)。 我怎么能阻止这种行为。 此致,Akhil @Jalal:我尝试了一些修改后的代码 private readonly object _userActivityLocker = new object(); private void btnSave_Click(object sender, EventArgs e) { if (System.Threading.Monitor.TryEnter(_userActivityLocker)) { //note that any sub clicks will be ignored while we are here try { DateTime dt = DateTime.Now; Thread.Sleep(2000); Debug.Print(“FirstClick {0} Second Click {1}”,dt.ToLongTimeString(), DateTime.Now.ToLongTimeString()); //here […]

ThreadState属性有什么价值?

这个问题让我想到了.NET等价物。 Thread类的ThreadState属性有什么价值? 在这个代码示例中: if (someThread.ThreadState != System.Threading.ThreadState.Running) { someThread = new Thread(SomeMethod); someThread.Start(); } someThread的ThreadState属性可以切换到if和if的代码之间Running ,对吗?

Application.Run(Form)vs. Form.Show()?

假设主GUI线程上发生了很多事情(数据流入,用户操作等)。 假设我们想创建一个表单并显示它。 如果我们使用Application.Run(Form)而不是Form.Show()是否可以提升性能? 有一个更好的方法吗? 请解释原因或原因。

在循环中创建新线程

我试图理解为什么这段代码不起作用。 private static object _lock; public static void Main (string[] args) { Thread thread; _lock = new object(); foreach (int num in Enumerable.Range(0,5)) { thread = new Thread (() => print(num.ToString())); thread.Start(); } } public static void print(string text) { lock(_lock) { Console.WriteLine(text); } } 我最终输出了 4 1 4 4 3 或任何其他随机数字的数字。 为什么重复数字?

使用TaskScheduler.FromCurrentSynchronizationContext更新Task中的UI

我想使用Task将一些文本添加到列表框中,我只需使用一个按钮并在单击事件中放置此代码: TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext(); Task.Factory.StartNew(() => { for (int i = 0; i < 10; i++) { listBox1.Items.Add("Number cities in problem = " + i.ToString()); System.Threading.Thread.Sleep(1000); } }, CancellationToken.None, TaskCreationOptions.None, uiScheduler); 但是直到for循环结束它才能工作并且UI被锁定。 问题出在哪儿 ? 谢谢 :)

如何访问阻塞集合的基础默认并发队列

我有多个生产者和一个消费者。 但是,如果队列中存在尚未消耗的内容,则生产者不应再次对其进行排队。 (唯一没有重复的阻塞集合使用默认的并发队列) if (!myBlockingColl.Contains(item)) myBlockingColl.Add(item) 但是,阻塞coll没有包含方法,也没有提供任何类型的trypeek()方法。 如何访问底层并发队列,以便我可以做类似的事情 if (!myBlockingColl.myConcurQ.trypeek(item) myBlockingColl.Add(item) 尾巴旋转。 请帮忙。 谢谢

为什么Thread.Join()在UI线程上调用时不挂起我的应用程序?

在我的理解中(我在线程方面不擅长),Join()阻塞调用线程,直到调用Join()的线程返回。 如果这是真的并且从UI线程调用了Join(),则为某些长时间运行的操作创建新线程没有任何意义。 有些问题,那些问为什么Join()挂起应用程序。 这看起来很自然。 顺便说一下,即使它看起来很自然,我的应用程序也没有相应的行为。 它不会挂起我的应用程序。 没有挂起应用程序的线程的代码: – string retValue = “”; retValue = LongRunningHeavyFunction(); txtResult.Text = retValue; 带有不挂应用程序的线程的代码: – string retValue = “”; Thread thread = new Thread( () => { retValue = LongRunningHeavyFunction(); }); thread.Start(); thread.Join(); txtResult.Text = retValue; 上面的代码很好,没有挂起应用程序 函数调用大约需要15-20秒。 为什么应用程序不挂起? 这对我来说不是问题; 实际上这是一个好消息。 但我只是不明白它有什么不同? 它与我阅读和学习的内容不符。 如果重要的话,我正在使用DotNet Framework 4.0。

Process.Start()在后台线程上运行时挂起

我整天都在排除故障。 在做了一些研究和大量的反复试验之后,似乎我已经能够将问题缩小到我对process.Start()调用不适用于计时器线程这一事实。 以下代码在主线程上运行时有效。 将完全相同的代码放在计时器回调中,它就会挂起。 为什么? 如何让它与计时器一起使用? private static void RunProcess() { var process = new Process(); process.StartInfo.FileName = “cmd”; process.StartInfo.Arguments = “/c exit”; process.StartInfo.UseShellExecute = false; process.StartInfo.RedirectStandardError = true; process.StartInfo.RedirectStandardInput = true; process.StartInfo.RedirectStandardOutput = true; process.Start(); // code hangs here, when running on background thread process.StandardOutput.ReadToEnd(); process.WaitForExit(); } 编辑 作为测试,我在另一台笔记本电脑上使用了完全相同的代码,我遇到了同样的问题。 这是可以粘贴到控制台应用程序中的完整代码。 process.Start()挂起,但只要我按任意键结束, process.Start()在程序结束前完成。 private static […]

Task.WaitAll不等待子任务?

你好我有_noOfThreads作为定义的任务一次运行。 所以我继续使用%运算符继续执行任务,在循环结束时我有Tasks.WaitAll 。 这是代码片段。 for (int index = 0; index < count; index++) { if (index { foo.bar(); }, TaskContinuationOptions.AttachedToParent); } Task.WaitAll(tasks); 但是,我注意到它不等待子任务完成。 父任务完成后, Task.WaitAll执行后的下一行。 如何更改此代码以等待子任务?