“在单独的线程中运行实例”的最简单方法是什么?

时间:2011-11-24 12:32:22

标签: c# .net parallel-processing

我试图通过将每个进程(类)放到一个单独的Thread来模拟分布式算法,因此它们将充当真正的隔离进程。这些流程应该能够相互沟通。

这段代码可以证明我想要做的事情:

public class Process
{
    public void Run()
    {
        Console.WriteLine("Run called from thread {0}", Thread.CurrentThread.ManagedThreadId);
    }

    public void Fnc()
    {
        Console.WriteLine("Fnc called from thread {0}", Thread.CurrentThread.ManagedThreadId);
        Thread.Sleep(1000);
    }
}

class Program
{
    static void Main()
    {
        Console.WriteLine("Main is running in thread {0}", Thread.CurrentThread.ManagedThreadId);

        Process p1 = new Process();

        var t1 = new Thread(p1.Run);
        t1.Start();


        // This should call Fnc() in t1 Thread. It should also return immediatelly not waiting for method Fnc() to finish.
        p1.Fnc();

        Console.ReadLine();
    }
}

我收到了这个输出:

Main is running in thread 9
Run called from thread 10
Fnc called from thread 9

我想得到这样的东西:

Main is running in thread 9
Run called from thread 10
Fnc called from thread 10

是否有可能实现这种功能?

谢谢!

5 个答案:

答案 0 :(得分:2)

您可以使用Thread Parallel Library:

System.Threading.Tasks.Task.Factory.StartNew( ( ) => p1.Run )
    .ContinueWith( ( t ) => p1.Fnc );

或者您创建了一个小帮助方法:

class Program
{
    private static Process p1 = new Process();
    static void Main()
    {
        Console.WriteLine("Main is running in thread {0}", Thread.CurrentThread.ManagedThreadId);

        var t1 = new Thread(Helper);
        t1.Start();
        Console.ReadLine();
    }

    private static Helper( )
    {
        p.Run();
        p.Fnc();
    }
}

答案 1 :(得分:2)

正如@PVitt所说,这不是你要提供的程序的可靠测试。您需要的是真正的单独的流程。

创建一个可执行文件并使用不同的命令行参数和/或在使用.NET框架中可用的任何RPC之后运行它,以使它们彼此“交谈”。

答案 2 :(得分:2)

除非明确设计该线程以支持此方法,否则没有机制来选择特定线程来运行方法。这种线程的基本要素是一个调度循环和一个线程安全的队列来接收包裹的工作。否则在文献中被producer/consumer problem所涵盖。你要求的是其他方式很难实现:

public void Run()
{
    Fnc();
}

答案 3 :(得分:1)

Action action = () => { p.Run(); p.Fnc(); };
var t1 = new Thread(action);
t1.Start();

答案 4 :(得分:0)

如果你使用.Net 4,我建议使用Tasks(http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.aspx),这很容易管理/取消他们。

要运行你需要的东西,只需写下:

Task.Factory.StartNew(()=>{p.Run(); p.Fnc();});