Какой самый простой способ «запустить экземпляр в отдельном потоке»? - PullRequest
3 голосов
/ 24 ноября 2011

Я пытаюсь смоделировать распределенный алгоритм, помещая каждый процесс (класс) в отдельный поток, чтобы они действовали как реальные изолированные процессы.Процессы должны иметь возможность взаимодействовать друг с другом.

То, что я пытаюсь сделать, может быть продемонстрировано этим фрагментом кода:

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 ]

2 голосов
/ 24 ноября 2011

Нет механизма для выбора определенного потока для запуска метода, если этот поток явно не предназначен для поддержки этого.Основными компонентами для такого потока являются цикл отправки и потокобезопасная очередь для получения пакетов работ.В остальном хорошо освещается в литературе как проблема производитель / потребитель .То, что вы просите, в противном случае просто реализовать:

public void Run()
{
    Fnc();
}
2 голосов
/ 24 ноября 2011

Как говорит @PVitt, это не надежный тест программы, которую вы собираетесь поставить. Что вам нужно, это настоящий отдельный процесс.

Создайте исполняемый файл и запустите его с другими параметрами командной строки и / или после использования любого RPC, доступного в .NET Framework, чтобы они «общались» друг с другом.

2 голосов
/ 24 ноября 2011

Вы можете использовать параллельную библиотеку потоков:

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 голос
/ 24 ноября 2011
Action action = () => { p.Run(); p.Fnc(); };
var t1 = new Thread(action);
t1.Start();
0 голосов
/ 24 ноября 2011

Если вы используете .Net 4, я бы посоветовал использовать Задачи (http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.aspx),, ими действительно легко управлять / отменять.

Чтобы запустить то, что вам нужно, просто напишите:

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