Tag: multithreading

以正确的顺序捕获进程stdout和stderr

我从C#启动一个进程如下: public bool Execute() { ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.Arguments = “the command”; startInfo.FileName = “C:\\MyApp.exe”; startInfo.UseShellExecute = false; startInfo.RedirectStandardOutput = true; startInfo.RedirectStandardError = true; Log.LogMessage(“{0} {1}”, startInfo.FileName, startInfo.Arguments); using (Process myProcess = Process.Start(startInfo)) { StringBuilder output = new StringBuilder(); myProcess.OutputDataReceived += delegate(object sender, DataReceivedEventArgs e) { Log.LogMessage(Thread.CurrentThread.ManagedThreadId.ToString() + e.Data); }; myProcess.ErrorDataReceived += delegate(object […]

System.Timers.Timer与System.Threading.Timer的线程安全性

在本文中: http : //msdn.microsoft.com/en-us/magazine/cc164015.aspx作者声明System.Threading.Timer不是线程安全的 。 从那以后,在Rich的书“CLR via C#”上的博客上重复了这一点,但这绝不合理。 此外, MSDN文档确保“此类型是线程安全的”。 1)谁说实话? 2)如果这是原始文章是什么使System.Threading.Timer不是线程安全的,它的包装器System.Timers.Timer如何实现更multithreading安全? 谢谢

线程和代表 – 我不完全理解他们的关系

我写了一个看起来像这样的代码: Thread t = new Thread(() => createSomething(dt, start, finish) ); t.Start(); 它工作(有时几乎感觉有多个线程) 但我不使用任何代表。 没有代表的踏板是什么意思 如果需要代表 – 那么请告诉我与代表的联系是什么以及如何。

使用blockingcollection和tasks .net 4 TPL的经典生产者消费者模式

请参阅下面的伪代码 //Single or multiple Producers produce using below method void Produce(object itemToQueue) { concurrentQueue.enqueue(itemToQueue); consumerSignal.set; } //somewhere else we have started a consumer like this //we have only one consumer void StartConsumer() { while (!concurrentQueue.IsEmpty()) { if (concurrentQueue.TrydeQueue(out item)) { //long running processing of item } } consumerSignal.WaitOne(); } 我如何移植我从远古时代以来使用的模式来使用taskfactory创建的任务和net 4的新信号function。换句话说,如果有人用net 4编写这个模式,它会是什么样子? 伪代码很好。 我已经使用了.net 4 […]

为什么ASP.NET杀死我的后台线程?

我的代码隐藏(aspx.cs)中有以下代码: protected void button1_Click(object sender, EventArgs e) { new Thread(delegate() { try { Thread.Sleep(30000); //do nothing for 30 seconds } catch (Exception ex) { //I AWLAYS get a ThreadAbortException here //in about 1 second WHY!?!??! } }).Start(); } ASP.NET会在请求结束时终止所有子线程吗? PS。 我预测很多“因为这不是最佳实践”的答案。 我知道在Windows服务中运行东西的最佳实践等。我只是好奇为什么线程在这个特定代码中被杀死,因为没有“Response.Redirect”,没有“Response.End”,没有池回收,没有IIS重启等等(人们重复“ASP.NET中的后台线程是坏的”口头禅的典型原因)。 更新:事实certificate它在ASP.NET MVC中工作正常 ! 线程仅在Web表单中中止! 哪个更奇怪。 有任何想法吗?

在c#中使用互斥锁

我在c#的线程中有点新,在一般情况下,在我的程序中,我使用mutex只允许1个线程进入一个关键部分,并且由于未知原因做了一些cw打印,我可以看到超过1个线程进入我的关键部分,这是我的代码: Mutex m = new Mutex(); m.WaitOne(); // critical section here m.ReleaseMutex(); 我非常想知道我是否在这里犯了一个错误,提前感谢您的帮助。 编辑: 我的代码包括类,所以它基本上看起来像这样: public class test { private mutex m; public test() { m = new mutex(); } public func() { m.WaitOne(); // critical section here m.ReleaseMutex(); } }

为什么内部exception到达ThreadException处理程序而不是实际抛出的exception?

在抛出exception并在Application.ThreadException事件处理程序中捕获它们时,我看到了一些奇怪的行为。 基本上,下面的示例中发生的是在BackgroundWorker的DoWork事件处理程序中抛出exception。 RunWorkerCompleted事件处理程序重新抛出一个新exception,原始exception作为内部exception。 为什么内部exception出现在ThreadException事件处理程序中而不是抛出的实际exception? 如果我在RunWorkerCompleted事件处理程序中没有提供内部exception,则会显示正确的exception。 using System; using System.Windows.Forms; using System.ComponentModel; namespace WierdExceptionApp { class WierdExceptionForm : Form { BackgroundWorker worker = new BackgroundWorker(); public WierdExceptionForm() { worker.DoWork += new DoWorkEventHandler(worker_DoWork); worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); worker.RunWorkerAsync(); } void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Error != null) { throw new Exception(“worker_RunWorkerCompleted”, e.Error); } } void […]

AutoResetEvent vs. boolean停止线程

我在工作线程中有一个对象,我可以指示它停止运行。 我可以使用bool或AutoResetEvent来实现它: 布尔: private volatile bool _isRunning; public void Run() { while (_isRunning) { doWork(); Thread.Sleep(1000); } } 的AutoResetEvent: private AutoResetEvent _stop; public void Run() { do { doWork(); } while (!_stop.WaitOne(1000)); } 然后Stop()方法将_isRunning设置为false,或调用_stop.Set() 。 除此之外,使用AutoResetEvent的解决方案可能会更快停止,这些方法之间有什么区别吗? 这个比那个好吗?

WPF C# – 从另一个线程更新进度条

我试图从其他类中运行的其他线程更新进度条。 为了解释我的所作所为,我认为一张图片会更好。 我想更新// HERE点的进度条: 我尝试过使用委托,尝试使用ReportProgress,我认为我基本上试图使用谷歌在前100个结果中报告的所有内容,但没有成功。 我还在学习WPF,这可能是一种愚蠢的方式,我正在寻找一种快速而肮脏的方式来完成工作,但随时告诉我应该为更清洁的应用程序重新设计。 编辑 :更多代码。 在ExecutorWindow.xaml.cs中: public void RunExecutor() { // CREATE BACKGROUNDWORKER FOR EXECUTOR execBackground.DoWork += new DoWorkEventHandler(execBackground_DoWork); execBackground.RunWorkerCompleted += new RunWorkerCompletedEventHandler(execBackground_RunWorkerCompleted); execBackground.ProgressChanged += new ProgressChangedEventHandler(execBackground_ProgressChanged); execBackground.WorkerReportsProgress = true; execBackground.WorkerSupportsCancellation = true; // RUN BACKGROUNDWORKER execBackground.RunWorkerAsync(); } private void execBackground_DoWork(object sender, DoWorkEventArgs e) { myExecutor = new Executor(arg1, arg2); myExecutor.Run(); } […]

使用Task.Factory.StartNew时更新UI标签

我试图在我的WPF应用程序中使我的UI更具响应性。 我使用生成一个新线程 Task.Factory.StartNew( () => RecurseAndDeleteStart() ); 在该方法RecurseAndDeleteStart()我想使用正在删除的文件更新UI中的标签。 如何实现这一目标?