Tag:

睡在一个混合的C#线程中

在这篇关于C#中线程的网络教程中,Joseph Albahari写道:“不要在汇集的线程中睡觉!” 你为什么不这样做? 它对性能的影响有多严重? (这不是我想要做的;我只是好奇。)

了解InvalidAsynchronousStateException事件

什么时候抛出InvalidAsynchronousStateException? 我有以下代码: control.InvokeRequired? control.Invoke(expression):expression(); 在一些随机的情况下,我得到InvalidAsynchronousStateException并且我的应用程序挂起,在做了一些阅读后,似乎是在创建control的线程完成时将抛出此exception。 它是否正确? 如果是这样的话,情况似乎并非如此,除非某些事情导致我的应用程序崩溃,这种exception只是后果? 这可能吗? System.ComponentModel.InvalidAsynchronousStateException:调用方法时发生错误。 目标线程不再存在。 System.Windows.Forms.Forvoke上的System.Windows.Forms.Control.WaitForWaitHandle(WaitHandle waitHandle)在System.Windows.Forms.Control.MarshaledInvoke(Control caller,Delegate方法,Object [] args,布尔同步)中的System.Windows.Forms.Control.WaitForWaitHandle(WaitHandle waitHandle)委托方法,Object [] args)位于c:\ Optimus \ Desktop \ Framework \中Optimus.Desktop.Framework.Spring.Aspects.UIThreadInterceptor.Invoke(IMethodInvocation调用)的System.Windows.Forms.Control.Invoke(Delegate方法) Spring \ Aspects \ UIThreadInterceptor.cs:Spring.Aop.Framework.AbstractMethodInvocation.Proceed()的第22行,Spring.Aop.Framework.DynamicProxy.AdvisedProxy.Invoke(对象代理,对象目标,类型targetType,MethodInfo targetMethod,MethodInfo proxyMethod,在Object.ComponentModel.Component.Finalize()的InheritanceAopProxy_4fda07e8828744839065a154b30915ee.Dispose(布尔处理)中的Object [] args,IList拦截器) 顺便说一句,我已经检查了这个答案并没有澄清我的疑问 – > 函数中的InvalidAsynchronousStateException检查控件是否需要调用

C#中Thread.Sleep的替代方案?

我有一个代码,在运行时,它按顺序执行一系列行。 我想在两者之间添加一个暂停。 目前,我有这样的 //do work Thread.Sleep(10800000); //do work 然而,这会冻结软件,我认为这是因为睡眠时间过长。 我在网上搜索,发现另一个名为Timer的工作。 有人可以给我看一个Timer的示例代码,它的工作原理就像Thread.sleep一样吗? 先感谢您。 编辑:我需要软件等待3个小时才能继续执行其余的代码。 该软件用于与机器通信,我不能让其余的代码在等待3个小时时执行。

什么是使用ThreadPool的正确方法?

如果我对ThreadPool的工作方式的理解是正确的,那么其目的之一是限制在给定时间可以创建的进程中的工作线程数。 例如,如果将MaxThreads设置为5然后调用QueueUserWorkItem 30次,则将向ThreadPool发出30个请求,但这些请求中只有5个将由新线程提供服务,而其他25个请求将被添加到队列中并且当先前的请求完成并且现有线程变得可用时,一次服务一个。 但是,在下面的代码中,对Thread.Sleep(-1)的调用保证DoSomething()方法永远不会返回,这意味着当前线程永远不会对后续请求可用。 但是我对ThreadPool工作方式的理解是不正确的,因为如果它是正确的,下面的代码只打印数字0-4而不是0-29。 有人可以解释ThreadPool如何工作以及为什么下面的代码没有做我认为它应该做的事情? static void DoSomething(object n) { Console.WriteLine(n); Thread.Sleep(-1); } static void Main(string[] args) { ThreadPool.SetMaxThreads(5, 5); for (int x = 0; x < 30; x++) { ThreadPool.QueueUserWorkItem(new WaitCallback(DoSomething), x); } Console.Read(); }

限制线程计数

我有一个列表,其中包含我要下载的项目。 我使用for循环来迭代列表。 对于此List中的每个项目,我启动一个引用该项目的新线程。 我的问题是我想要同时限制maxDownload。 for (int i = downloadList.Count – 1; i >= 0; i–) { downloadItem item = downloadList[i]; if (item.Status != 1 && item.Status != 2) { ThreadStart starter = delegate { this.DownloadItem(ref item); }; Thread t = new Thread(starter); t.IsBackground = true; t.Name = item.Name; t.Priority = ThreadPriority.Normal; t.Start(); } } 我读了一些关于ThreadPool的内容,但后来我无法引用我的项目。 […]

ThreadPool.QueueUserWorkItem中的最大排队元素

我将最大线程设置为10.然后我使用ThreadPool.QueueUserWorkItem添加了22000任务。 运行该程序后很可能并非所有22000任务都已完成。 有多少任务可以排队等待可用线程?

ThreadPool最大线程

我在.NET的ThreadPool(.NET 4)上遇到了一些麻烦。 我已经读过默认情况下.NET每个处理器有25个线程的限制,但根据SO和其他地方的论坛post,我可以用下面的代码增加限制。 void SetThreads(int threads) { ThreadPool.SetMaxThreads(threads, threads); ThreadPool.SetMinThreads(threads, threads); } 但是,当我将上面的内容设置为某个任意高的数字(例如2000)和队列~1000个项目时,我仍然只运行~33个线程(.NET CLR需要约5个线程),而ThreadPool.GetAvailableThreads()返回1971剩下的线程。 为什么上面的代码不起作用?

如何在不阻止UI的情况下等待线程完成

我希望我的程序在下面的行之后等待 frmProgressBarObj = PullMSI.ExtractByMSIName(“products.txt”, false); 如上所述,方法是通过StartProcessWithProgress()方法在内部调用线程。 我希望在执行代码逻辑-2行之前完成该线程。 同时,它不应该停止由frmProgressBar.UpdateProgress()完成UI更新。 我该怎么做呢? namespace NS1 { public partial class frmMain : Form { private void button1_Click(object sender, EventArgs e) { frmProgressBar frmProgressBarObj = PullMSI.ExtractByMSIName(“products.txt”, false); //code logic – 2 MessageBox.Show(“This is executing immediately. I want to wait until above thread is complete”); } } public partial class frmProgressBar : […]

委托.BeginInvoke和在C#中使用ThreadPool线程之间的区别

在C#中,使用委托异步地执行某些工作(调用BeginInvoke())和使用ThreadPool线程之间有任何区别,如下所示 public void asynchronousWork(object num) { //asynchronous work to be done Console.WriteLine(num); } public void test() { Action myCustomDelegate = this.asynchronousWork; int x = 7; //Using Delegate myCustomDelegate.BeginInvoke(7, null, null); //Using Threadpool ThreadPool.QueueUserWorkItem(new WaitCallback(asynchronousWork), 7); Thread.Sleep(2000); } 编辑: BeginInvoke确保线程池中的线程用于执行异步代码,所以有什么区别吗?

抛出了System.OutOfMemoryException – WebClient.DownloadStringAsynch()

我正在编写一个可怜的勒芒负载测试器,我认为我正在正确管理我的资源(线程池)但是当我运行以下代码时,我在调用WebClient.DownloadStringAsynch时得到一个OutOfMemoryException。 使用.net4.0但可以移动到4.5。 问: 修复是什么? 我怎么能使用HttpWebRequest并发送asynch作为webclient的替代? 使用等待使用.net 4.5怎么样(与.net4如何管理带有异步调用的线程有什么不同? static void Main(string[] args) { System.Net.ServicePointManager.DefaultConnectionLimit = 200; while (true) { for (int i = 0; i < 100; i++) { Task.Factory.StartNew(LoadTestAsynchNET40); } Console.WriteLine("…………………….sleeping…………………………."); Thread.Sleep(2); } } static void LoadTestAsynchNET40() { string url = "http://mysrv.com/api/dev/getthis?stuff=thestuff" + "&_=" + DateTime.Now.Ticks; // <— somtimes throws here… using (var client = […]