如何从另一个类访问实例化的对象?

时间:2019-01-28 03:58:11

标签: c#

我想从另一个类终止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,并使用不同的参数重新分配并重新启动它。 这可能吗?

已编辑: 也许我应该问过如何从另一个类访问实例化的对象?

3 个答案:

答案 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();
    }
}