Tag: multithreading

获取IIS工作进程崩溃转储

我在ASP.NET应用程序中做了一些不好的事情。 它可能是我正在使用的任意数量的CTP库,或者我只是没有妥善处理。 但是当我将ASP.NET重新部署到我的Vista IIS7安装或我的服务器的IIS6安装时,我崩溃了IIS工作进程。 我已经将问题缩小到我的HTTP爬虫,这是一个multithreading的野兽,在被要求时抓取网站以获取有用的信息。 在我启动爬虫并在顶部重新部署应用程序之后,IIS工作进程将崩溃(弹出崩溃消息)并继续重新加载应用程序域,而不是正常卸载appDomain并重新加载。 发生此崩溃时,我在哪里可以找到崩溃转储进行分析?

将ThreadStatic变量与async / await一起使用

使用C#中的新async / await关键字,现在会对使用ThreadStatic数据的方式(以及何时)产生影响,因为回调委托在不同的线程上执行,同时启动了async操作。 例如,以下简单的控制台应用程序: [ThreadStatic] private static string Secret; static void Main(string[] args) { Start().Wait(); Console.ReadKey(); } private static async Task Start() { Secret = “moo moo”; Console.WriteLine(“Started on thread [{0}]”, Thread.CurrentThread.ManagedThreadId); Console.WriteLine(“Secret is [{0}]”, Secret); await Sleepy(); Console.WriteLine(“Finished on thread [{0}]”, Thread.CurrentThread.ManagedThreadId); Console.WriteLine(“Secret is [{0}]”, Secret); } private static async Task Sleepy() { Console.WriteLine(“Was […]

是否在C#中对属性进行读写?

在C#中读取和写入某些基本类型(如bool和int是primefaces的。 (参见C#语言规范第5.5节“5.5变量引用的primefaces性”) 但是如何通过属性访问这些变量呢? 假设它们也是primefaces和线程安全的是否合理? 例如, MyProperty读取primefaces和线程安全吗?: public bool MyProperty { get { return _foo; } } 那么自动实现的属性呢? public bool MyProperty { get; }

使用并发启用队列

我有一个先前的问题 ,我提供了解决方案; 但是,因为我在.Net 3.5上,所以我无法访问ConcurrentQueue 。 我需要Queue来允许并发。 我读了这个问题 ,如果一个项目不在队列中并且线程方法试图使项目出列,则似乎存在问题。 我现在的任务是确定是否可以派生自己的并发队列类。 这就是我提出的: public sealed class ConcurrentQueue : Queue { public event EventHandler TableQueued; private ICollection que; new public void Enqueue(DataTable Table) { lock (que.SyncRoot) { base.Enqueue(Table); } OnTableQueued(new TableQueuedEventArgs(Dequeue())); } // this is where I think I will have a problem… new public DataTable Dequeue() { DataTable […]

在WPF中Control.InvokeRequired发生了什么?

我正在编写一个小型WPF应用程序,它会产生一些线程来对网站页面进行压力测试。 我想在我从主WPF线程手动启动的线程的状态的wpfforms的文本框中输出一些信息。 我有点期望WPF具有相同的function,只要通过以下方式将我的线程同步回GUI线程: if(this.InvokeRequired) this.Invoke(ProcessState); 但是WPF中没有任何类型的东西……在WPF中从非gui线程输出的选项是什么? 编辑:问题现在似乎是因为我无法检查我的控件的Dispatcher对象的方法CheckAccess() 。 我正在运行.net和VS 2008 SP1的3.5版本。 这是我的Dispatcher类的完整元数据(F12就可以了): using MS.Internal.WindowsBase; using System; using System.ComponentModel; using System.Security; using System.Threading; namespace System.Windows.Threading { // Summary: // Provides services for managing the queue of work items for a thread. public sealed class Dispatcher { // Summary: // Gets the System.Windows.Threading.Dispatcher for the thread currently […]

是否有一个C#等同于Java的CountDownLatch?

是否有一个C#等同于Java的CountDownLatch ?

提供异步串口通信

目前,我们的应用程序通过串口连接到Arduino。 我们发送一些ASCII格式的命令,并得到相同的回报。 为此,我们有一个命令队列,一个专门用于将这些命令写入端口的线程,以及一个专门用于读取和处理所有传入回复的线程。 类本身负责调度回复,这给了它太多的责任(应该只负责端口操作,而不是业务逻辑)。 我们宁愿以异步方式执行此操作。 系统中的任何内容都可以发送带有回调函数和超时的命令。 如果串口得到正确答复,则调用回调函数。 否则,它会超时并可能调用第二个回调(或者可能是带有succeeded?标志的单个回调)。 但是,我们只使用异步方法(特别是在Web操作中),而不是编写这样的系统。 谁能给我们一些关于如何进行的指示? 我们当前的计划是存储这些命令的队列。 在任何回复时,如果找到相关联的命令(通过比较ASCII值),它将被出列并执行回调。 计时器将定期检查超时,出队并执行适当的回调。 这似乎是一个简单的解决方案,但支持这一点的代码数量正在大幅增加,我们希望确保没有更好的内置解决方案或最佳实践。 编辑 :为了进一步澄清,这个特定的类是一个单例(无论好坏),还有许多其他线程可以访问它。 例如,一个线程可能想要请求传感器值,而另一个线程可能正在控制电机。 这些命令及其相关的回复不是以线性方式发生的; 时机可能会逆转。 因此,传统的生产者 – 消费者模式是不够的; 这更像是一个调度员。 例如,让我们调用这个单例类Arduino 。 Thread A正在运行,并且想要发送命令”*03″ ,因此它调用Arduino.Instance.SendCommand(“*03″) 。 同时, Thread B发送命令”*88” ,这两个命令都是近实时发送的。 一段时间之后, Arduino的SerialPort.Read()线程获取*88的回复然后回复*03 (即以相反的顺序发送它们)。 我们如何允许Thread A和Thread B正确阻止等待特定的回复进来? 我们假设我们将在每个线程中使用AutoResetEvent ,并使用异步回调让我们设置它。

我以为还在等待与调用者相同的线程,但似乎没有

我认为关于async / await的一点是,当任务完成时,继续在调用await时在相同的上下文上运行,在我的情况下,这将是UI线程。 例如: Debug.WriteLine(“2: Thread ID: ” + Thread.CurrentThread.ManagedThreadId); await fs.ReadAsync(data, 0, (int)fs.Length); Debug.WriteLine(“3: Thread ID: ” + Thread.CurrentThread.ManagedThreadId); 我不指望这个: 2: Thread ID: 10 3: Thread ID: 11 是什么赋予了? 为什么延续的线程ID与UI线程不同? 根据这篇文章 [^]我需要显式调用ConfigureAwait来改变连续上下文的行为!

如何防止sockets/端口耗尽?

我试图通过跨多个线程的请求命中它来对网站进行性能测试。 每个线程执行n次。 (在for循环中) 但是,我遇到了问题。 特别是WebException(“无法连接到远程服务器”)与内部exception: 无法执行对套接字的操作,因为系统缺少足够的缓冲区空间或者队列已满,因此127.0.0.1:52395 我试图在每个线程500次迭代时运行100个线程。 最初我在System.Net中使用HttpWebRequest向服务器发出GET请求。 目前我正在使用WebClient因为我假设每次迭代都使用新的套接字(因此在短时间内就会有100 * 500个套接字)。 我假设WebClient(每个线程实例化一次)只会使用一个套接字。 我不需要一次打开50 000个套接字,因为我想发送GET请求,接收响应并关闭套接字,释放它以便在下一个循环迭代中使用。 我明白这将是一个问题 但是,即使使用WebClient,也会请求一堆套接字,从而在TIME_WAIT模式下生成一堆套接字(使用netstat检查)。 这会导致其他应用程序(如Internet浏览器)挂起并停止运行。 我可以用更少的迭代和/或更少的线程来操作我的测试,因为看起来套接字最终会退出这个TIME_WAIT状态。 但是,这不是一个解决方案,因为它没有充分测试Web服务器的function。 题: 在每次线程迭代后如何显式关闭套接字(从客户端)以防止TIME_WAIT状态和套接字耗尽? 码: 包装HttpRequest的类 编辑:在使用中包装WebClient,因此为每次迭代实例化,使用和处理新的WebClient。 问题仍然存在。 public sealed class HttpGetTest : ITest { private readonly string m_url; public HttpGetTest( string url ) { m_url = url; } void ITest.Execute() { using (WebClient webClient = new WebClient()){ […]

Thread.Sleep(timeout)和ManualResetEvent.Wait(timeout)有什么区别?

Thread.Sleep(timeout)和resetEvent.Wait(timeout)都会导致执行暂停至少timeout毫秒,那么它们之间是否存在差异? 我知道Thread.Sleep导致线程放弃其时间片的剩余部分,因此可能导致睡眠持续时间远远超过要求的时间。 ManualResetEvent对象的Wait(timeout)方法是否具有相同的问题? 编辑 :我知道ManualResetEvent的主要要点是从另一个线程发出信号 – 现在我只关注事件的Wait方法的情况,指定了超时,没有其他调用者设置事件。 我想知道是否比Thread.Sleep更准确地唤醒准时