none
Возврат данных из вторичного потока в главный поток RRS feed

  • Вопрос

  • Всем привет!

    В коде, приведенном ниже,
    главный поток запускает четыре идентичных вторичных процесса.
    Отклики от этих вторичных процессов необходимо вернуть обратно главному потоку.
    Вопрос - как это сделать?

    using System; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using System.Collections.Generic; using System.Diagnostics; namespace DataReturn { public partial class MainForm : Form { public MainForm() { InitializeComponent(); btStart.Select();} Process [] ProcessArr; Thread SubMainThread; List<int> ILst; public WaitHandle[] WaitHandleArr = new WaitHandle [] { new AutoResetEvent(false), new AutoResetEvent(false), new AutoResetEvent(false), new AutoResetEvent(false) }; public List<string> AnswersLst; private void btStart_Click ( object o,EventArgs e ) { SubMainThread = new Thread ( new ThreadStart( Start ) ); SubMainThread.Start (); } public void Start () { ProcessArr = new Process [4]; ILst = new List<int>() { 0,1,2,3 }; AnswersLst = new List<string>(); for ( int i=0;i<2;i++ ) { ParallelLoopResult result = Parallel.ForEach <int> ( ILst, DoTask ); WaitHandle.WaitAll ( WaitHandleArr ); // Ожидание завершения всех запущенных задач } } // ??? public string ReceiveAnswerFromSecondTask () { return ReceivedString; } // ??? public void DoTask ( int i ) { ProcessArr [i] = new Process (); ProcessArr [i].StartInfo.FileName = "D:\\SecondTask.exe"; ProcessArr [i].StartInfo.Arguments = i.ToString(); ProcessArr [i].Start (); // AnswersLst.Add ( ReceiveAnswerFromSecondTask () );
    ProcessArr [i].WaitForExit ();
    (( AutoResetEvent ) WaitHandleArr [i] ).Set ();
    } } }


    Вторичные процессы -

    using System;
    using System.Windows.Forms;
    using System.Threading;	
    	namespace	SecondTask
    	{	public	partial	class		SecondForm	:	Form
    		{	public	SecondForm	()
    			{	InitializeComponent();
    				PArr = Environment.GetCommandLineArgs ();
    				Start ();
    			}
    			public	Mutex		MutexDataExchange;
    			public	string []		PArr;
    /*	???	*/	public	string		AnswerToStarter	( string S )	{ return S;	}	// ???
    			public	void			Start	()
    			{	MutexDataExchange		=	new Mutex ();
    //				MessageBox.Show			(	PArr[1]	);
    				MutexDataExchange.WaitOne ();
    				AnswerToStarter			(	"AnswerFrom - " + PArr[1]	);
    				MutexDataExchange.ReleaseMutex ();
    	}	}	}
    • Изменено QazRdx 18 января 2016 г. 9:54
    17 января 2016 г. 11:08

Ответы

Все ответы

  • Добрый день.

    Взаимодействие между потоками отдельная сказка. Вот здесь посмотрите.

    • Помечено в качестве ответа QazRdx 18 января 2016 г. 9:53
    18 января 2016 г. 7:21
    Отвечающий
  • Да, это оно!
    Thanks!
    18 января 2016 г. 9:53
  • Пожалуйста.
    18 января 2016 г. 10:14
    Отвечающий
  • И все-таки остается вопрос - 
    где в сервере появляется сообщение от клиента ?

    В предложенном примере есть три модуля -
    клиент, сервер и удаленный объект.
    У меня клиент и сервер - это отдельные задачи,
    а удаленный объект - принадлежит dll-библиотеке.
    на которую ссылаются и клиент и сервер.
    Запускаю последовательно сервер, потом - клиент,
    сервер распечатывает сообщения от клиента через посредство удаленного объекта,
    все как и требуется - сообщение от клиента попадает к серверу.
    Но непонятно, откуда берется эта печать, и куда именно это сообщение попадает,
    какой переменной в сервере ?

    18 января 2016 г. 15:29
  • Посмотрите пример вот здесь. Вроде в нем попонятнее описано.
    19 января 2016 г. 6:52
    Отвечающий
  • Сорри, был занят!
    Что-то я так и не понял, как же можно в сервере получить сообщение от клиента.
    Это сообщение сервером распечатывается, но как и чем его поймать - не понятно.
    20 января 2016 г. 6:49