ProKiLL
@ProKiLL
Системный администратор

Как вернуть значение из метода при его выполнении в потоке?

Есть метод
ServerSocetStart (код сократил для наглядности) в классе Sockets
public class Sockets
{
 public string message = string.Empty;

 public static void ServerSocetStart()
 {
  while (true)
   {
     ...
     message = builder.ToString(); //builder - переменная получаемая в ходе неких манипуляций в цикле while
   }
 }
}

Запускаю метод в основном потоке
(new Thread (delegate () { Sockets.ServerSocetStart(); })).Start();


Вопрос: как можно получить переменную message в основном потоке во время выполнения дочернего?
  • Вопрос задан
  • 619 просмотров
Пригласить эксперта
Ответы на вопрос 2
DarkRaven
@DarkRaven
разработка программного обеспечения
М, а почему вы не можете добавить событие в класс Sockets, подписаться на него в основном потоке?

Как-то так:

class Sockets 
{
    public static event MessageAppearsHandler OnMessageAppears;
    
    ***
    
    public static void ServerSocetStart()
    {
        while (true)
        {
            ...
            message = builder.ToString(); //builder - переменная получаемая в ходе неких манипуляций в цикле while
            OnMessageAppears?.Inkove(null, new MessageAppearsEventArgs(message));
        }
    }
}

delegate void MessageAppearsHandler(object sender, MessageAppearsEventArgs eventArgs);

class MessageAppearsEventArgs: EventArgs
{
    public string Message { get; }

    public MessageAppearsEventArgs(string message)
    {
        Message = message;
    }
}


Дополнительно, советую обратить внимание на вот это https://stackoverflow.com/a/2789642/2822609
Ответ написан
Комментировать
petermzg
@petermzg
Самый лучший программист
Тут не ясно, что вы подразумеваете под "как можно получить переменную message в основном потоке".
Что для вас значит это "Получить"?

1. У вас код не рабочий, в static методе, вы не сможете установить переменную инстанса класса.
2. С какой целью получить? У любого процесса единое адресное пространство и оно не имеет привязки к потоку, все доступно.
var socket = new Sockets();
      socket.message - доступен из любого места программы, при наличии указателя на инстанс socket.

2.1. Если вам нужно значение отобразить в UI контроле (они хотят доступа только из потока создателя), то придется синхронизировать и выполнять установку значений из UI потока.
2.1.1. Вызов метода через метод Invoke контрола.
2.1.2. Старые добрые Windows messages - WM_USER, если у вас WinForms
2.1.3. SynchronizationContext
2.1.4. И другие специфичные варианты.
2.2. Если это не UI, то возможно вам и не нужна синхронизация (зависит от задачи)
2.2.1. Обычный Callback
2.2.2. Установка сигнального состояния Event
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы