相关疑难解决方法(0)

C#Thread Termination和Thread.Abort()

在MSDN中,Thread.Abort()方法的描述说:"调用此方法通常会终止线程."

为什么不总是?

在哪些情况下它不会终止线程?

有没有其他可能终止线程?

.net c# multithreading

82
推荐指数
6
解决办法
8万
查看次数

.NET中双重检查锁定需要volatile修饰符

多个文本说,当在.NET中实现双重检查锁定时,您锁定的字段应该应用volatile修饰符.但为什么呢?考虑以下示例:

public sealed class Singleton
{
   private static volatile Singleton instance;
   private static object syncRoot = new Object();

   private Singleton() {}

   public static Singleton Instance
   {
      get 
      {
         if (instance == null) 
         {
            lock (syncRoot) 
            {
               if (instance == null) 
                  instance = new Singleton();
            }
         }

         return instance;
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

为什么不"锁定(syncRoot)"完成必要的内存一致性?在"lock"语句之后,读取和写入都是不稳定的,因此必须实现必要的一致性,这不是真的吗?

c# singleton volatile

80
推荐指数
4
解决办法
2万
查看次数

停止线程、ManualResetEvent、易失性布尔值或取消令牌

我在 Windows 服务中有一个线程 (STAThread),它执行大量工作。当 Windows 服务重新启动时,我想优雅地停止这个线程。

我知道几种方法

  • 一个不稳定的布尔值
  • 手动重置事件
  • 取消令牌

据我发现 Thread.Abort 是不行的......

最佳做法是什么?这项工作是在另一个类中执行的,而不是线程启动的类,因此有必要在构造函数中引入一个 cancelToken 参数,或者例如有一个 volatile 变量。但我就是不知道什么是最聪明的。

更新
只是为了澄清一点,我已经总结了我正在谈论的一个非常简单的例子。如前所述,这是在 Windows 服务中完成的。现在我正在考虑一个在循环中检查的可变布尔值或一个取消令牌......我不能等待循环完成,如下所述,它可能需要几分钟,使服务器的系统管理员相信当他们需要重新启动服务时,服务出了点问题......我可以毫无问题地将循环中的所有工作都毫无问题地删除,但是我不能用 Thread.Abort 来做到这一点,它是“邪恶的”,而且是一个 COM接口被调用,所以需要一个小的清理。

Class Scheduler{
  private Thread apartmentThread;
  private Worker worker;

  void Scheduling(){
    worker = new Worker();
    apartmentThread = new Thread(Run);
    apartmentThread.SetApartmentState(ApartmentState.STA);
    apartmentThread.Start();    
  }

  private void Run() {
    while (!token.IsCancellationRequested) {
      Thread.Sleep(pollInterval * MillisecondsToSeconds);
      if (!token.IsCancellationRequested) {
        worker.DoWork();
      }
    }
  }
}

Class Worker{
  //This will take several minutes....
  public void DoWork(){
    for(int i = 0; i < …
Run Code Online (Sandbox Code Playgroud)

c# multithreading cancellation cancellation-token

5
推荐指数
2
解决办法
9292
查看次数

如何处理不返回的函数

我有一个名为ApiCalls()的函数,它包含在一个锁定器中,因为我使用的api不是多线程安全的.偶尔api调用无法返回,我想不出办法处理这种情况.我正在考虑在锁定对象上创建一个计时器,但似乎锁定器没有这样的东西.

c#

1
推荐指数
1
解决办法
253
查看次数