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

本文关键字:最简单 方法 是什么 实例 运行 单独 线程 | 更新日期: 2023-09-27 18:15:51

我试图通过将每个进程(类)放入单独的线程来模拟分布式算法,因此它们将充当真正的隔离进程。进程之间应该能够相互通信。

我要做的事情可以用这段代码来演示:

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

有可能实现这种功能吗?

谢谢!

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

你可以使用线程并行库:

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

正如@PVitt所说,这不是对你将要交付的项目的可靠测试。您需要的是真正的独立的进程。

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

没有机制来选择一个特定的线程来运行一个方法,除非这个线程被明确地设计为支持这个。这样一个线程的基本组成部分是一个调度循环和一个线程安全的队列来接收工作包。否则在文献中就会被很好地描述为生产者/消费者问题。你所要求的是很容易实现的:

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

如果你使用。net 4,我建议使用任务(http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.aspx),它真的很容易管理/取消它们。

运行你需要的代码:

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