我想从另一个类终止Program类中的线程thr1, 我创建了如下所示的PoC代码以更好地演示它。 假设我的程序类如下:
public class Program
{
public static Thread thr1;
public static void Main(string[] args)
{
Thread thr1= new Thread(() => Class1.DoSomething(param1,param2));
thr1.Start();
Thread.Sleep(1000);
Test.Exec();
}
}
这是我的测试班:
public class Test
{
public static void Exec()
{
Program.thr1.Abort();
Program.thr1= new System.Threading.Thread(() => Class1.DoSomething(param1, param2));
Program.thr1.Start();
}
}
我真正想做的是通过Test类中的Exec方法终止Program类中的thr1,并使用不同的参数重新分配并重新启动它。 这可能吗?
已编辑: 也许我应该问过如何从另一个类访问实例化的对象?
答案 0 :(得分:2)
解决方案,@ Karan提及:
替换
Thread thr1= new Thread(() => Class1.DoSomething(param1,param2));
与
thr1 = new Thread(() => Class1.DoSomething(param1,param2));
它应该可以按预期工作。
修改
之所以不起作用,是因为在Thread thr1
中声明Main
的代码中创建了新的本地实例,其他类无法访问。
由于全局对象是静态的,因此它将始终为您提供相同的引用。因此,将其分配为thr1 = new Thread(() => Class1.DoSomething(param1,param2));
会很好。
答案 1 :(得分:1)
作为一般建议元素,请避免线程中止。它不会导致正常关机,并且可能导致各种问题。最重要的是,确保您的线程不负责保持任何相关数据完整。 Thread.Abort将导致引发ThreadAbortException,并且通常不会导致您在所有情况下都希望发生。如果您不控制在线程中启动的代码,则可能没有其他选择,但如果选择这样做,则不要使用此机制。
考虑使用类似这样的东西。 (请注意,相关部分是您可以在工作线程上正常终止正在执行的工作(有时很难):
这是一个C#7.2控制台应用程序(因为它具有async main方法)。
只需将其创建为要测试的控制台应用程序即可,但是如果您从实际的命令行运行它,因为VS有时会因CTRL-C中断而不能很好地发挥作用。
internal class Program
{
private static async Task Main(string[] args)
{
var cts = new CancellationTokenSource();
Console.WriteLine("Press CTRL-C to STOP!");
Console.CancelKeyPress += (sender, eventArgs) => cts.Cancel();
var longRunningTask = Task.Run(() => DoSomethingLongRunning(cts.Token));
while (!longRunningTask.IsCompleted)
{
await Task.Delay(50, cts.Token);
}
}
private static async Task DoSomethingLongRunning(CancellationToken token)
{
while (!token.IsCancellationRequested)
{
await Task.Delay(1000, token);
Console.WriteLine("Doing Something");
}
}
}
答案 2 :(得分:0)
尝试一下
public class Program
{
public static Thread thr1;
public static void Main(string[] args)
{
thr1= new Thread(() => Class1.DoSomething(param1,param2));
thr1.Start();
Thread.Sleep(1000);
Test.Exec();
}
}
测试类
public class Test
{
public static void Exec()
{
Program.thr1.Abort();
Program.thr1= new System.Threading.Thread(() => Class1.DoSomething(param1, param2));
Program.thr1.Start();
}
}