Tag: threadpool

从ThreadPool调用线程上的Thread.Abort

我的同事正在使用第三方.NET库,我们没有源代码。 我们正在使用ThreadPool让很multithreading调用到这个库中,偶尔其中一个线程将永远挂起,而其余的线程会随意地进行调整。 所以我们想使用可怕的Thread.Abort来杀死这样的线程。 我在开始自己的线程之前已经完成了这个,但我从未使用过ThreadPool。 如果我们跟踪每个任务的开始时间,如下所示: static Dictionary started = new Dictionary(); static void DoSomeWork(object foo) { lock(started) started[Thread.CurrentThread] = DateTime.Now; SomeBuggyLibraryThatMightInfiniteLoopOrSomething.callSomeFunction(doo); lock(started) started.Remove(Thread.CurrentThread); } 那么我们可以锁定并迭代正在运行的线程并调用Thread.Abort来杀死它们吗? 如果我们这样做,那么我们是否需要在ThreadPool中添加一个新线程来替换我们刚刚杀死的线程,或者ThreadPool会为我们处理它? 编辑:我非常清楚Thread.Abort的所有潜在问题。 我知道理想情况下它应该永远不会在生产代码中使用,并且它不一定会停止线程,并且如果你在线程获得锁定时中止线程,那么你可以挂断其他线程等。但是现在我们处于一个紧迫的截止日期,我们有理由相信,在这个特殊情况下,我们可以调用Thread.Abort而不会使整个过程处于危险之中,我们希望避免重写此程序以消除除非我们绝对必须,否则ThreadPool。 所以我想知道的是:假设我们将在一个属于ThreadPool的线程上调用Thread.Abort ,这些是ThreadPool线程引起的任何特殊问题,我们是否必须手动启动一个新线程替换被杀死的那个或者ThreadPool会为我们做那个吗?

如何从CLR线程池而不是ASP.NET池创建ASP.NET页面中的线程?

如果我在ASP.NET页面上创建一个新线程,则IsThreadPoolThread属性为true。 第一个问题是,它来自ASP.NET池还是CLR池? 第二个问题是,如果它是从ASP.NET池那么如何从CLR创建一个线程而不使用ASP.NET池? 我需要一个长期运行请求的同步解决方案( 全文 )。

在.NET ThreadPool中停止所有线程?

我在.NET中使用ThreadPool在后台发出一些Web请求,我希望有一个“停止”按钮来取消所有线程,即使它们正在发出请求,所以一个简单的bool不会这样做工作。 我怎样才能做到这一点?

跨线程操作在Windows窗体中无效

任何人都可以帮助我,我有一个问题我正在尝试通过线程池让这个代码在后台工作,但我似乎无法让它工作,我一直得到这个错误: Cross-thread operation not valid: Control ‘ListBox3’ accessed from a thread other than the thread it was created on. 这是我正在使用的代码: private void DoWork(object o) { var list = ListBox3; var request = createRequest(TxtServer.Text, WebRequestMethods.Ftp.ListDirectory); using (var response = (FtpWebResponse)request.GetResponse()) { using (var stream = response.GetResponseStream()) { using (var reader = new StreamReader(stream, true)) { while […]

C#使用ThreadPool执行方法(带参数)

我们有以下代码(在本网站上找到此代码的想法),它将为方法“Do_SomeWork()”生成新线程。 这使我们能够异步多次运行该方法。 代码是: var numThreads = 20; var toProcess = numThreads; var resetEvent = new ManualResetEvent(false); for (var i = 0; i < numThreads; i++) { new Thread(delegate() { Do_SomeWork(Parameter1, Parameter2, Parameter3); if (Interlocked.Decrement(ref toProcess) == 0) resetEvent.Set(); }).Start(); } resetEvent.WaitOne(); 但是我们想要使用ThreadPool而不是创建我们自己的新线程,这可能对性能有害。 问题是如何修改上面的代码以使用ThreadPool,记住方法“Do_SomeWork”采用多个参数并且还具有返回类型(即方法不是void)。 此外,这是C#2.0。

HttpWebRequest和I / O完成端口

我正在开发一个应用程序,它需要一种类型的消息才能访问数据库,而另一种类型的消息要去一些外部的xml api。 我必须处理A LOT …其中一个重大挑战是让HttpWebRequest类表现良好。 我最初开始只使用标准的同步方法和线程整个事情。 这不好。 因此,经过一些阅读后,我看到推荐的方法是使用Begin / End方法将工作委托给IO完成端口,从而释放线程池并产生更好的性能。 这似乎不是这样的……性能稍微好一些,但我当然看不到与threadpool相比使用的IO完成端口。 我有一个旋转的线程,并向我发送线程池中可用的工作线程+完成端口。 完成端口总是非常低(我看到的最大值是9)并且我总是使用大约120个工作线程(有时更多)。 我对httpwebrequest所有方法使用开始/结束模式: Begin/EndGetRequestStream Begin/EndWrite (Stream) Begin/EndGetResponse Begin/EndRead (Stream) 我做得对吗? 我错过了什么吗? 我可以同时使用(有时)多达2048个http连接(来自netstat输出) – 为什么完成端口号会这么低? 如果有人可以就如何处理这个管理工作线程,完成端口和httpwebrequest提供一些认真的建议,那将非常感激! 编辑:.NET是一个合理的工具吗? 我可以使用.NET和System.Net堆栈获得大量的http连接吗? 有人建议使用类似WinHttp(或其他一些C ++库)的东西,并从.NET中调用它,但这不是我特别想做的事情!

线程池中的活动线程号

当我编写下面的代码时,为什么我得到可用的线程编号,如1022,1020。我必须得到25个线程最大,因为我使用线程池。 我猜输出线程号是系统上的可用线程。 我需要在win表单应用程序中的线程池中获取可用的线程号。 private void Foo() { int intAvailableThreads, intAvailableIoAsynThreds; // ask the number of avaialbe threads on the pool, //we really only care about the first parameter. ThreadPool.GetAvailableThreads(out intAvailableThreads, out intAvailableIoAsynThreds); // build a message to log string strMessage = String.Format(@”Is Thread Pool: {1}, Thread Id: {2} Free Threads {3}”, Thread.CurrentThread.IsThreadPoolThread.ToString(), Thread.CurrentThread.GetHashCode(), intAvailableThreads); // […]

ThreadPool.QueueUserWorkItem,带有lambda表达式和匿名方法

将两个参数传递给线程池上的新线程有时会很复杂,但看起来使用lambda表达式和匿名方法,我可以这样做: public class TestClass { public void DoWork(string s1, string s2) { Console.WriteLine(s1); Console.WriteLine(s2); } } try { TestClass test = new TestClass(); string s1 = “Hello”; string s2 = “World”; ThreadPool.QueueUserWorkItem( o => test.DoWork(s1, s2) ); } catch (Exception ex) { //exception logic } 现在,我肯定简化了这个例子,但这些要点是关键: 传递的字符串对象是不可变的,因此是线程安全的 s1和s2变量在try块的范围内声明,我在将工作排队到线程池后立即退出,因此在此之后永远不会修改s1和s2变量。 这有什么问题吗? 另一种方法是创建一个实现具有3个成员的不可变类型的新类:test,s1和s2。 这似乎是额外的工作,在这一点上没有任何好处。

C# – ThreadPool QueueUserWorkItem使用?

就在我现在使用以下代码添加排队的线程。 我不喜欢它。 而且我的同事也不会因为他们不太了解C#。 我想要的当然是将一个方法排队在一个新线程中执行。 private static void doStuff(string parameter) { // does stuff } // call (a) ThreadPool.QueueUserWorkItem(a => doStuff(“hello world”)); // call (b) ThreadPool.QueueUserWorkItem(delegate { doStuff(“hello world”); }); 那么ThreadPool.QueueUserWorkItem还有其他用途吗? 最好的是另一个1-Line-Call。 如果可能,使用Func或Action 。 编辑:得到(b)答案和评论,我已经更喜欢它了。

如何使用log4net使用Threadpool线程记录正确的上下文?

我试图找到一种方法来记录一堆线程中的有用上下文。 问题是很多代码都是通过线程池线程到达的事件处理的(据我所知),因此它们的名称与任何上下文无关。 可以使用以下代码演示此问题: class Program { private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); static void Main(string[] args) { new Thread(TestThis).Start(“ThreadA”); new Thread(TestThis).Start(“ThreadB”); Console.ReadLine(); } private static void TestThis(object name) { var nameStr = (string)name; Thread.CurrentThread.Name = nameStr; log4net.ThreadContext.Properties[“ThreadContext”] = nameStr; log4net.LogicalThreadContext.Properties[“LogicalThreadContext”] = nameStr; log.Debug(“From Thread itself”); ThreadPool.QueueUserWorkItem(x => log.Debug(“From threadpool Thread: ” + nameStr)); } […]