@ViceInc

Как запустить Invoke не из основного потока?

Раньше пользовался подобной схемой и работало. Тут вдруг стал ругаться на Invoke

public class ClientHandler
    {
        //Поля
        private Socket handler;
        private Thread thread;
        private int errorsCount;
        public bool finished;
        
        public delegate void RSAPublicKeyMessageHandler(RSAPublicKeyMessage message);
        public event RSAPublicKeyMessageHandler RSAPublicKeyMessageReceived;

        

        private ClientHandler(Socket socket)
        {
            handler = socket;
            finished = false;
            errorsCount = 0;

            StartAsync();
        }

        public async void StartAsync()
        {
            await Task.Run(() => Start());
        }

        public void Start()
        {
                //..............
                BaseMessage outputMessage = Do(inputMessage);
                //..............
        }







        private BaseMessage Do(BaseMessage inputMessage)
        {
            try
            {
                if(inputMessage is RSAPublicKeyMessage rSAPublicKeyMessage)
                {
                    //Вот этот Invoke не выполянется, потому что владелец объекта другой поток
                    RSAPublicKeyMessageReceived?.Invoke(rSAPublicKeyMessage);
                    return new ServiceMessage(false, "OK");
                }
            }
            catch (Exception ex)
            {
                return new ServiceMessage(true, ex.Message);
            }
        }
  • Вопрос задан
  • 65 просмотров
Решения вопроса 1
@ViceInc Автор вопроса
Делал проект по быстрому и не сделал для окна ViewModel
Подписывался на событие из самого класса окна, в этом и была проблема.
Надо было сделать ViewModel для окна и оттуда подписываться на событие
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Davilkus
@Davilkus
Делаю игры)
Попробуйте через Dispatcher
Это для WPF я использую

Когда-то откопал, теперь юзаю это:
При обновлении UI:

this.Dispatcher.Invoke(() =>
{
...// your code here.
});
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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