Tag: multithreading

从这样的另一个线程发送电子邮件是没关系的吗?

在一个网站,有时发送电子邮件需要几秒钟,所以我需要从另一个线程发送电子邮件,不要等到电子邮件发送。 我在stackoverflow上找到了这个答案 ,以这种方式做到这一点很好,因为每次请求我只会发送一封电子邮件吗? 或者还有另一种标准方法可以做到这一点?

c#中的定时器初始化和竞争条件?

我在Richter的书上看到了这段代码: 下面的代码演示了如何让线程池线程调用立即启动的方法,然后每隔2秒调用一次: /*1*/ internal static class TimerDemo /*2*/ { /*3*/ private static Timer s_timer; /*4*/ public static void Main() /*5*/ { /*6*/ Console.WriteLine(“Checking status every 2 seconds”); /*7*/ // Create the Timer ensuring that it never fires. This ensures that /*8*/ // s_timer refers to it BEFORE Status is invoked by a thread pool thread […]

将Ping应用程序转换为multithreading版本以提高速度 – C#

我有一个应用程序,它会ping本地子网上的每个可能的IP,以便编译响应的IP地址列表。 目前,它一次ping所有255个。 是否可以将此应用程序转换为使用多个线程来通过一次ping多个来提高速度? 我是multithreading概念的新手,并认为这是一个很好的学习方法(只要当然可能)。 此外,您可以教育我的任何风格改进也会有所帮助。 提前谢谢 这是backgroundWorker1_DoWork事件中的当前ping方法。 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { count = 0; for (int i = 1; i < 255; i++) { Ping ping = new Ping(); PingReply pingreply = ping.Send(IPAddress.Parse(locip[0] + "." + locip[1] + "." + locip[2] + "." + i)); count += 1; if (pingreply.Status == IPStatus.Success) […]

Control.Invoke()与其Delegate调用之间的延迟有多长?

我有一个代码引擎,通过使用waveOutOpen和waveOutWrite API方法连续播放较小的块来播放长WAV文件。 为了在文件播放时更新我的​​UI,在每个缓冲区完成播放时从回调函数更新我调用一个单独的线程(因为你想在回调函数中做尽可能少的事情)调用我的表单中的方法。 该表单包含一个类级别的EventHandler ,它处理一个方法,在该方法中我用新信息更新UI元素。 在从waveOutWrite回调函数调用的form方法中,我使用Invoke方法,如下所示: if (_updatedisplay == null) { // UpdateDisplay contains code to set control properties on the form _updatedisplay = new EventHandler(UpdateDisplay); } Invoke(_updatedisplay); Everythings工作,但似乎偶尔会有更新UI元素的明显延迟或延迟。 这很容易看到,因为我使用UpdateDisplay方法来驱动动画,因此延迟显示为“打嗝”,其中精灵在跳转到其预期位置之前会在一瞬间冻结。 这样的跨线程通信有时可能会有很长(可能是10-15毫秒)的延迟吗? 如果是这样,处理这样的事情的更好方法是什么? 更新 :顺便说一下,我绝对不确定Invoke是否是罪魁祸首。 另一种可能性是在一大块音频完成播放和实际调用回调函数之间存在滞后。 更新2 :根据itowlson的建议,我使用System.Diagnostics.Stopwatch来测试Invoke和方法调用之间的延迟。 在1156次测量中,我在0ms获得1146,在1ms获得8,在2ms获得2。 我认为说Invoke不是我的罪魁祸首是安全的。

访问MemoryStream的不同线程

有一些代码通过调用GetBuffer()将数据直接写入MemoryStream对象的数据缓冲区。 它还适当地使用和更新Position和SetLength()属性。 此代码在99.9999%的时间内正常工作。 从字面上看。 只有每隔几十万次的迭代它才会出现。 具体问题是MemoryStream的Position属性突然返回零而不是适当的值。 但是,添加了检查0的代码并抛出exception,其中包括在单独的方法中记录MemoryStream属性(如位置和长度)。 那些返回正确的值。 在同一方法中进一步添加日志记录表明,当出现这种罕见情况时,Position在此特定方法中仅为零。 好的。 显然,这必须是一个线程问题。 而且很可能是编译器优化问题。 但是,这个软件的本质是它由调度程序的“任务”组织,因此几个实际的操作系统线程中的任何一个都可以在任何给定时间运行此代码 – 但一次不得超过一个。 所以我的猜测通常会发生同样的线程不断用于此方法,然后在极少数情况下使用不同的线程。 (只需编写想法,通过捕获和比较线程ID来测试这个理论。) 然后由于编译器优化,不同的线程永远不会得到正确的值。 它得到一个“陈旧”的价值。 通常在这种情况下,我会将“volatile”关键字应用于相关变量,以查看是否可以修复它。 但在这种情况下,变量位于MemoryStream对象中。 有没有人有任何其他想法? 或者这是否意味着我们必须实现自己的MemoryStream对象? 真诚的,韦恩 编辑:只运行一个测试,计算此方法的调用总数,并计算ManagedThreadId与上次调用的次数不同的次数。 它几乎完全是50%的时间切换线程 – 在它们之间交替。 所以我上面的理论几乎肯定是错的,或者错误会更频繁地发生。 编辑:这个错误很少发生,它需要将近一个星期没有错误运行之前感到有任何信心,它真的消失了。 相反,最好运行实验来确切地确定问题的本质。 编辑:当前锁定是通过使用MemoryStream的5种方法中的每一种中的lock()语句来处理的。

.NET线程是否与操作系统线程不同?

.NET线程是轻量级用户模式线程还是内核模式操作系统线程? 另外,保留SQL Server,.NET线程和操作系统线程之间是否存在一对一的对应关系? 我也很感兴趣因为Thread类有一对名为EndThreadAffinity和EndThreadAffinity的对称方法,其文档巧妙地暗示.NET线程是真实操作系统线程上的轻量级抽象。 此外,我刚才读到一些堆栈溢出线程本身,微软试图在CLR中保持这种分离,就像SQL Server一样。 我记得有一些项目正在使用Fiber API来实现这个目的,但我不能说我理解了我所读到的所有细节。 我想要一些关于这个主题的更详细的文献,比如.NET线程的内部结构与Windows创建的线程的内部结构相比。 虽然有很多关于Windows创建的线程结构的信息,但Jeffrey Richter的高级Windows编程书是其中一个来源,例如,我找不到任何专门讨论.NET线程内部结构的文献。 有人可能会争辩说,这些信息可以在.NET源代码中找到,现在可以公开获得,或者使用反汇编程序,如Reflector或IL Spy,但是我没有看到任何代表线程控制块(TCB)和程序的信息。计数器(PC)和堆栈指针(SP)或线程的等待队列,或线程当前在Thread类中成员的队列列表。 我在哪里可以读到这个? 文档中是否提到了它的任何内容? 我已经从MSDN上阅读了所有这些页面,但他们似乎没有提到它。

Dispatcher不会使用C#Windows Forms Application

我有一个带有进度条的C#Windows窗体应用程序。 我想根据某些方法状态动态地进行。 我在一个单独的类中有该方法,并为该方法创建一个新线程,并使用委托将该方法的状态传递给父线程。 我可以使用progressbar.Dispatcher在WPF应用程序中解决相同的情况,但在Windows窗体应用程序中没有Dispatcher,即使我使用System.Threading命名空间。 progressbar.Dispatcher似乎只在WPF应用程序中可用。

lock(this)和lock(thisLock)有什么区别?

我正在读锁定语句(C#参考) ,在那里我看到了这段代码: class Account { private Object thisLock = new Object(); //… int Withdraw(int amount) { lock (thisLock) { //…. } } //… } 我想知道如果我们在上面的例子中写lock(this)而不是lock(thisLock)会有什么不同。 如果你的答案取决于它,请参阅完整的例子 。 如果你认为lock(this)和lock(thisLock)之间确实存在一些差异,那么请帮助我理解所有重点之间的区别。 特别是,每个人到底意味着什么?

线程的ExecutionContext

ExecutionContext.SuppressFlow();的目的是什么? ? 在下面的代码中究竟被压制了什么? 我有这个测试代码…… protected void btnSubmit_Click(object sender, EventArgs e) { Thread[] th = new Thread[100]; Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(“en-GB”); AsyncFlowControl cntrl = ExecutionContext.SuppressFlow(); for (int i = 0; i < th.Length; i++) { th[i] = new Thread(new ParameterizedThreadStart(ThreadMethod)); th[i].Name = "Thread #" + (i+1).ToString(); th[i].Start((i+1).ToString()); } ExecutionContext.RestoreFlow(); foreach (Thread t in th) { t.Join(); […]

何时在UI应用程序中调用SynchronizationContext.SetSynchronizationContext()?

我正在学习SynchronizationContext类。 我试图了解在WinForm / WPF应用程序的上下文中调用SynchronizationContext.SetSynchronizationContext()的常见用法场景。 设置线程的SynchronizationContext意味着什么? 我什么时候该做,为什么? 另外,如果我设置它,我应该在某个时候取消它吗? 编辑: 在他的回答中,@ Hans Passant问为什么我在考虑SetSynchronizationContext() 。 我的想法是在工作线程上设置上下文,以便在该线程上运行的代码将具有要使用的上下文。 private void button3_Click(object sender, EventArgs e) { var syncContext = SynchronizationContext.Current; Task.Factory.StartNew(() => { // Setup the SynchronizationContext on this thread so // that SomeAsyncComponentThatNeedsACurrentContext // will have a context when it needs one if (SynchronizationContext.Current == null) SynchronizationContext.SetSynchronizationContext(syncContext); var c = […]