private CancellationTokenSource source = new CancellationTokenSource();
private CancellationToken token;
public void Connect()
{
client = new TcpClient(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1313));
br = new BinaryReader(client.GetStream());
}
public async void BeginReceive()
{
token = source.Token;
await Task.Factory.StartNew(() =>
{
while (true)
{
if (source.IsCancellationRequested)
return;
string str = br.ReadString();
lock (lockDane)
dane.Add(str);
}
},
token);
}
public void EndReceive()
{
source.Cancel();
}
Możesz spróbować takiego rozwiązania.
Co prawda Task'a nie można zakończyć metodą Abort (jak w przypadku klasy Thread), ale wykorzystując async/await z poziomu interfejsu użytkownika nie będzie widoczne, że po kliknięciu np. "zakończ" program dokończy w tle aktualny odczyt (ale go nie zapisze bo sprawdzi wcześniej właściwość "IsCancellationRequested").