Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在单线程对象上逐个调用不同的操作_C#_Multithreading - Fatal编程技术网

C# 在单线程对象上逐个调用不同的操作

C# 在单线程对象上逐个调用不同的操作,c#,multithreading,C#,Multithreading,我希望同一个线程执行多个操作。 请参阅下面的代码: namespace ConsoleApplication1 { public interface ISample { void show(); } class A : ISample { public void show() { Console.WriteLine("Inside A"); } } class B : ISample { public void show() {

我希望同一个线程执行多个操作。 请参阅下面的代码:

namespace ConsoleApplication1
{
public interface ISample
{
    void show();
}
class A : ISample
{
    public void show()
    {
        Console.WriteLine("Inside A");

    }
}

class B : ISample
{
    public void show()
    {
        Console.WriteLine("Inside B");

    }
}

class Program
{
    static void Main(string[] args)
    {
        ISample aObj = new A();
        System.Threading.ThreadStart ts1 = new System.Threading.ThreadStart(aObj.show);
        System.Threading.Thread t1 = new System.Threading.Thread(ts1);
        t1.Start();
        t1.Join();
        aObj = new B();
        t1.Start();
        Console.ReadLine();
    }
}
}


上述代码导致异常。我看到很多关于重新启动线程的讨论。在我的例子中,我希望在同一个线程上一个接一个地执行多个操作。对我来说,我正在寻找解决方案,从同一线程上的不同对象运行不同的方法。所有这些对象都是实现上述代码中相同接口的类。请建议我最好的方法来执行这一点。换句话说,如果一个方法是完整的,那么同一个线程应该启动另一个对象的方法。这可能吗

您可以尝试将所有需要的方法分组到一个匿名委托中:

 Thread t1 = new Thread(
          () => {
               aObj.show();
               bObj.doStuff();
              });
 t1.Start();
更新: 如果事先不知道方法列表,则可以使用类在特定线程上运行方法:

 Thread t1 = new Thread(Dispatcher.CurrentDispatcher.Run);
 t1.Start();     
 Dispatcher.FromThread(t1).Invoke(()=>a.aObj.show());
您可以实现“生产者/消费者”模式(例如,如果可以使用.Net 4,可以使用ConcurrentQueue和BlockingCollection)


这样,您就有了一个工作线程,它将从主线程中获取作业。对于您的场景,这是一个非常灵活的解决方案。

唯一的限制是您需要事先知道要执行的方法(对于我来说,不清楚OP是否希望这样做),这将不起作用,因为我不知道在可用的线程对象上必须调用哪些方法。为每个节点可视化一个树状结构和一个线程。@NutanJayavant,用另一个选项更新了答案-使用Dispatcher类。