我有一个应用程序用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。
答案 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);
}
不要忘记处理它。