C#杀死所有主题

时间:2012-01-03 11:38:49

标签: c# multithreading

我有一个应用程序用InvokeMember()调用我的DLL,如下所示:

Assembly OCA = Assembly.LoadFrom("./Modules/ProcessFiles.dll");
Type[] types = OCA.GetTypes();
foreach (var type in types)
{
    //MethodInfo[] methods = type.GetMethods();
    if (type.Name == "Converter")
    {
        var tmpType = type;
        var obj = Activator.CreateInstance(tmpType);
        Thread t = new Thread(
            () =>
            tmpType.InvokeMember("Run", BindingFlags.Default | BindingFlags.InvokeMethod, null, obj,
            null));
        t.Start();
        break;
    }

}

我的DLL然后创建一个新线程并开始处理。在我的DLL中,我创建了这样的新线程:

Thread thread = new Thread(
    delegate(){
        while(true)
        {
            GetFilesInFolder();
            Thread.Sleep(120000);
        }
    });
ne.Start();

目标是定期检查文件夹。问题是,当我关闭调用我的DLL的应用程序时,该进程未关闭。有没有办法关闭所有线程?

注意:我无法修改应用程序,我只能修改我的DLL。

4 个答案:

答案 0 :(得分:8)

将线程的IsBackground属性设置为true。当你的应用程序完成时,这将终止该线程。

另外:为什么不使用一个定时器(或只是一个线程)来唤醒和分析数据。这应该更加资源友好。

答案 1 :(得分:6)

您尝试使用System.IO.FileSystemWatcher吗?这会在文件夹中发生更改时抛出事件。看起来这将简化您的解决方案。

答案 2 :(得分:1)

如何从here

实施安全取消
class RulyCanceler
{
  object _cancelLocker = new object();
  bool _cancelRequest;
  public bool IsCancellationRequested
  {
    get { lock (_cancelLocker) return _cancelRequest; }
  }

  public void Cancel() { lock (_cancelLocker) _cancelRequest = true; } 

  public void ThrowIfCancellationRequested()
  {
    if (IsCancellationRequested) throw new OperationCanceledException();
  }
}

测试

class Test
{
  static void Main()
  {
    var canceler = new RulyCanceler();
    new Thread (() => {
                        try { Work (canceler); }
                        catch (OperationCanceledException)
                        {
                          Console.WriteLine ("Canceled!");
                        }
                      }).Start();
    Thread.Sleep (1000);
    canceler.Cancel();               // Safely cancel worker.
  }

  static void Work (RulyCanceler c)
  {
    while (true)
    {
      c.ThrowIfCancellationRequested();
      // ...
      try      { OtherMethod (c); }
      finally  { /* any required cleanup */ }
    }
  }

  static void OtherMethod (RulyCanceler c)
  {
    // Do stuff...
    c.ThrowIfCancellationRequested();
  }
}

答案 3 :(得分:0)

您可以使用上面提到的后台线程或计时器:

Timer checkTimer;
public void StartTimer()
{
    checkTimer = new Timer(s => GetFilesInFolder(), null, 0, 120000);
}

不要忘记处理它。