Fix calling schedule task cause deadlock (#1586)

This commit is contained in:
ReinforceZwei 2021-05-12 22:31:06 +08:00 committed by GitHub
parent 7723ed57ea
commit b15c3a8e46
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 55 additions and 6 deletions

View file

@ -700,6 +700,12 @@ namespace MinecraftClient
/// </summary> /// </summary>
/// <param name="task">Task to run</param> /// <param name="task">Task to run</param>
public object ScheduleTask(Delegate task) public object ScheduleTask(Delegate task)
{
if (!InvokeRequired())
{
return task.DynamicInvoke();
}
else
{ {
var taskAndResult = new TaskWithResult(task); var taskAndResult = new TaskWithResult(task);
lock (threadTasksLock) lock (threadTasksLock)
@ -709,6 +715,25 @@ namespace MinecraftClient
taskAndResult.Block(); taskAndResult.Block();
return taskAndResult.Result; return taskAndResult.Result;
} }
}
/// <summary>
/// Check if calling thread is main thread or other thread
/// </summary>
/// <returns>True if calling thread is other thread</returns>
public bool InvokeRequired()
{
int callingThreadId = Thread.CurrentThread.ManagedThreadId;
if (handler != null)
{
return handler.GetNetReadThreadId() != callingThreadId;
}
else
{
// net read thread (main thread) not yet ready
return false;
}
}
#region Management: Load/Unload ChatBots and Enable/Disable settings #region Management: Load/Unload ChatBots and Enable/Disable settings

View file

@ -201,6 +201,15 @@ namespace MinecraftClient.Protocol.Handlers
netRead.Start(); netRead.Start();
} }
/// <summary>
/// Get net read thread (main thread) ID
/// </summary>
/// <returns>Net read thread ID</returns>
public int GetNetReadThreadId()
{
return netRead != null ? netRead.ManagedThreadId : -1;
}
public void Dispose() public void Dispose()
{ {
try try

View file

@ -67,7 +67,7 @@ namespace MinecraftClient.Protocol.Handlers
PacketTypePalette packetPalette; PacketTypePalette packetPalette;
SocketWrapper socketWrapper; SocketWrapper socketWrapper;
DataTypes dataTypes; DataTypes dataTypes;
Thread netRead; Thread netRead; // main thread
ILogger log; ILogger log;
public Protocol18Handler(TcpClient Client, int protocolVersion, IMinecraftComHandler handler, ForgeInfo forgeInfo) public Protocol18Handler(TcpClient Client, int protocolVersion, IMinecraftComHandler handler, ForgeInfo forgeInfo)
@ -1112,6 +1112,15 @@ namespace MinecraftClient.Protocol.Handlers
netRead.Start(); netRead.Start();
} }
/// <summary>
/// Get net read thread (main thread) ID
/// </summary>
/// <returns>Net read thread ID</returns>
public int GetNetReadThreadId()
{
return netRead != null ? netRead.ManagedThreadId : -1;
}
/// <summary> /// <summary>
/// Disconnect from the server, cancel network reading. /// Disconnect from the server, cancel network reading.
/// </summary> /// </summary>

View file

@ -235,5 +235,11 @@ namespace MinecraftClient.Protocol
/// </summary> /// </summary>
/// <param name="selectedSlot">The slot of the trade, starts at 0.</param> /// <param name="selectedSlot">The slot of the trade, starts at 0.</param>
bool SelectTrade(int selectedSlot); bool SelectTrade(int selectedSlot);
/// <summary>
/// Get net read thread (main thread) ID
/// </summary>
/// <returns>Net read thread ID</returns>
int GetNetReadThreadId();
} }
} }