Разве вы не можете просто выполнить цикл внутри метода фонового рабочего?
private void BackGroundGetServerData(object sender, DoWorkEventArgs e)
{
while(true)
{
Byte[] dataArray = new Byte[2];
try
{
_DataStream.Read(dataArray, 0, 2);
String reply = System.Text.Encoding.ASCII.GetString(dataArray);
e.Result = reply;
}
catch (Exception ex)
{
return;
}
}
}
Затем при отключении просто закройте розетку. Это приведет к тому, что Exception
будет добавлено в цикл while, и вы сможете корректно выйти через блок catch
.
Edit
: Затем вы можете обновить графический интерфейс из цикла после прочтения каждого сообщения. Убедитесь, что дескриптор обновляемого элемента управления доступен (при условии, что он называется box
):
delegate void updateDelegate(String p);
private void BackGroundGetServerData(object sender, DoWorkEventArgs e)
{
while(true)
{
Byte[] dataArray = new Byte[2];
try
{
_DataStream.Read(dataArray, 0, 2);
String reply = System.Text.Encoding.ASCII.GetString(dataArray);
box.BeginInvoke(new updateDelegate(writeToBox), reply);
}
catch (Exception ex)
{
return;
}
}
}
BeginInvoke
требуется в этом случае, потому что вы пытаетесь обновить графический интерфейс из другого потока, что недопустимо. Этот метод перенаправляет обновление в поток графического интерфейса.