.NET 5.0 — Немедленно остановите запущенный поток в приложении WPF

#wpf #multithreading #.net-5 #c#-9.0

Вопрос:

Я разрабатываю приложение WPF для сбора данных в режиме реального времени от удаленного клиента. Сбор данных управляется другим потоком (отличным от того, который используется для запуска основного приложения). Когда пользователи нажимают кнопку подключения, запускается поток сбора данных, и, аналогично, при нажатии кнопки отключения поток должен прекратиться. Чтение данных прекращается только тогда, когда пользователь принимает такое решение. Я использую следующий код:

 private void ConnectButton_Click(object sender, RoutedEventArgs e)
{
   connectionThread = new Thread(new ThreadStart(myThreadStartFunc));
   connectionThread.Start();
}

private void myThreadStartFunc()
{
   TcpConnect();
   ReadData();
}

private void TcpConnect()
{
   mySocket = new Socket(...);
   mySocket.Connect(ipEndPoint);
}

private void ReadData()
{
   while(mySocket.Connected)
   {
      Thread.Sleep(300);
      mySocket.Receive(data, ...);
   }
}

private void DisconnectButton_Click(object sender, RoutedEventArgs e)
{
   StopThread(connectionThread);
}

private void StopThread(Thread thread)
{

}
 

Каким должно быть основное содержание StopThread метода? В настоящее время я использую thread.Interrupt() структуру try and catch в методе StopThread. Он генерирует исключение в цикле while метода считывания данных в строке Thread.Sleep(300) : Система.Нарезание резьбы.Исключение прерывания потока: Поток был прерван из состояния ожидания.

Я хотел бы использовать этот thread.Abort() метод, но он устарел (https://docs.microsoft.com/en-us/dotnet/core/compatibility/core-libraries/5.0/thread-abort-obsolete). Есть какие-нибудь предложения? Заранее спасибо.

Комментарии:

1. Просто закройте сокет — при условии, что функция ReadData() завершится так же, как функция DataReading(). Неясно, как связаны эти два метода.

2. К сожалению, функция DataReading() не существует. Используя mySocket.Close() в StopThread() , я получаю систему. Исключение ObjectDisposedException: Не удается получить доступ к удаленному объекту ; в строке mySocket.Receive(data, ...) .

3. Сначала вызовите разъединение и закройте его после завершения потока или поместите цикл чтения в блок try/catch.

4. Я хотел бы сначала остановить поток, а затем закрыть сокет. Извините, я закрыл сокет не в StopThread , а непосредственно в DisconnectButton_Click , а затем это исключение было сгенерировано.

5. Конечно, остановите поток чтения, вызвав Disconnect. while(mySocket.Connected) тогда все закончится.