2011-11-24 116 views
3

我试图通过将每个进程(类)放入一个单独的线程来模拟分布式算法,因此它们将充当一个真正独立的进程。这些流程应该能够相互沟通。“在单独的线程中运行实例”的最简单方法是什么?

我所试图做的可以通过这一段代码来证明:

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 

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

谢谢!

+1

如果要隔离过程,你应该使用的过程,而不是线程。线程不像真正的孤立进程。 – PVitt

+0

当你从主线程调用p1.fun()时,第一个输出很明显。它并不清楚你想要达到什么。 –

+0

'Run'和'Fnc'应该同时运行吗?那么你将需要多个线程。或者应该在运行'Fnc'时运行'暂停执行?或者都是短期运行特效?你想在一个单独的过程中运行它们还是只在一个单独的线程中运行它们? – Jan

回答

2

您可以使用线程并行库:

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

使用任务的解决方案将做到这一点!谢谢。你的第二个选择(以及@ RedHat的解决方案)只能在一个简单的情况下工作,但我需要一个更通用的解决方案。 – jakubka

2

由于@PVitt说,这是不是你要为客户提供PROGRAMM的可靠的测试。你需要的是real单独的进程。

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

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

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

public void Run() 
{ 
    Fnc(); 
} 
0

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

要运行你所需要这样写:

Task.Factory.StartNew(()=>{p.Run(); p.Fnc();}); 
相关问题