diff --git a/MinecraftClient/McClient.cs b/MinecraftClient/McClient.cs
index 00bd910a..5493739d 100644
--- a/MinecraftClient/McClient.cs
+++ b/MinecraftClient/McClient.cs
@@ -446,6 +446,8 @@ namespace MinecraftClient
///
public void OnConnectionLost(ChatBot.DisconnectReason reason, string message)
{
+ handler.Dispose();
+
world.Clear();
if (timeoutdetector != null)
@@ -761,7 +763,7 @@ namespace MinecraftClient
int callingThreadId = Thread.CurrentThread.ManagedThreadId;
if (handler != null)
{
- return handler.GetNetReadThreadId() != callingThreadId;
+ return handler.GetNetMainThreadId() != callingThreadId;
}
else
{
diff --git a/MinecraftClient/Protocol/Handlers/Protocol16.cs b/MinecraftClient/Protocol/Handlers/Protocol16.cs
index a819b3a1..1d8dd59c 100644
--- a/MinecraftClient/Protocol/Handlers/Protocol16.cs
+++ b/MinecraftClient/Protocol/Handlers/Protocol16.cs
@@ -218,7 +218,7 @@ namespace MinecraftClient.Protocol.Handlers
/// Get net read thread (main thread) ID
///
/// Net read thread ID
- public int GetNetReadThreadId()
+ public int GetNetMainThreadId()
{
return netRead != null ? netRead.Item1.ManagedThreadId : -1;
}
diff --git a/MinecraftClient/Protocol/Handlers/Protocol18.cs b/MinecraftClient/Protocol/Handlers/Protocol18.cs
index 2036b75b..9389091f 100644
--- a/MinecraftClient/Protocol/Handlers/Protocol18.cs
+++ b/MinecraftClient/Protocol/Handlers/Protocol18.cs
@@ -76,7 +76,8 @@ namespace MinecraftClient.Protocol.Handlers
PacketTypePalette packetPalette;
SocketWrapper socketWrapper;
DataTypes dataTypes;
- Tuple? netRead = null; // main thread
+ Tuple? netMain = null; // main thread
+ Tuple? netReader = null; // reader thread
ILogger log;
RandomNumberGenerator randomGen;
@@ -172,7 +173,9 @@ namespace MinecraftClient.Protocol.Handlers
///
private void Updater(object? o)
{
- if (((CancellationToken)o!).IsCancellationRequested)
+ CancellationToken cancelToken = (CancellationToken)o!;
+
+ if (cancelToken.IsCancellationRequested)
return;
try
@@ -180,7 +183,7 @@ namespace MinecraftClient.Protocol.Handlers
Stopwatch stopWatch = new();
while (!packetQueue.IsAddingCompleted)
{
- ((CancellationToken)o!).ThrowIfCancellationRequested();
+ cancelToken.ThrowIfCancellationRequested();
handler.OnUpdate();
@@ -210,7 +213,7 @@ namespace MinecraftClient.Protocol.Handlers
catch (ObjectDisposedException) { }
catch (OperationCanceledException) { }
- if (((CancellationToken)o!).IsCancellationRequested)
+ if (cancelToken.IsCancellationRequested)
return;
handler.OnConnectionLost(ChatBot.DisconnectReason.ConnectionLost, "");
@@ -219,13 +222,14 @@ namespace MinecraftClient.Protocol.Handlers
///
/// Read and decompress packets.
///
- internal void PacketReader()
+ internal void PacketReader(object? o)
{
- while (socketWrapper.IsConnected())
+ CancellationToken cancelToken = (CancellationToken)o!;
+ while (socketWrapper.IsConnected() && !cancelToken.IsCancellationRequested)
{
try
{
- while (socketWrapper.HasDataAvailable())
+ while (socketWrapper.HasDataAvailable() && !cancelToken.IsCancellationRequested)
packetQueue.Add(ReadNextPacket());
}
catch (System.IO.IOException) { break; }
@@ -1449,20 +1453,24 @@ namespace MinecraftClient.Protocol.Handlers
///
private void StartUpdating()
{
- new Thread(new ThreadStart(PacketReader)).Start();
+ Thread threadUpdater = new Thread(new ParameterizedThreadStart(Updater));
+ threadUpdater.Name = "ProtocolPacketHandler";
+ netMain = new Tuple(threadUpdater, new CancellationTokenSource());
+ threadUpdater.Start(netMain.Item2.Token);
- netRead = new Tuple(new Thread(new ParameterizedThreadStart(Updater)), new CancellationTokenSource());
- netRead.Item1.Name = "ProtocolPacketHandler";
- netRead.Item1.Start(netRead.Item2.Token);
+ Thread threadReader = new Thread(new ParameterizedThreadStart(PacketReader));
+ threadReader.Name = "ProtocolPacketReader";
+ netReader = new Tuple(threadReader, new CancellationTokenSource());
+ threadReader.Start(netReader.Item2.Token);
}
///
/// Get net read thread (main thread) ID
///
/// Net read thread ID
- public int GetNetReadThreadId()
+ public int GetNetMainThreadId()
{
- return netRead != null ? netRead.Item1.ManagedThreadId : -1;
+ return netMain != null ? netMain.Item1.ManagedThreadId : -1;
}
///
@@ -1472,9 +1480,12 @@ namespace MinecraftClient.Protocol.Handlers
{
try
{
- if (netRead != null)
+ if (netMain != null)
{
- netRead.Item2.Cancel();
+ netMain.Item2.Cancel();
+ }
+ if (netReader != null){
+ netReader.Item2.Cancel();
socketWrapper.Disconnect();
}
}
diff --git a/MinecraftClient/Protocol/IMinecraftCom.cs b/MinecraftClient/Protocol/IMinecraftCom.cs
index 5a713257..52bfcac7 100644
--- a/MinecraftClient/Protocol/IMinecraftCom.cs
+++ b/MinecraftClient/Protocol/IMinecraftCom.cs
@@ -252,6 +252,6 @@ namespace MinecraftClient.Protocol
/// Get net read thread (main thread) ID
///
/// Net read thread ID
- int GetNetReadThreadId();
+ int GetNetMainThreadId();
}
}