mirror of
https://github.com/MCCTeam/Minecraft-Console-Client
synced 2025-10-14 21:22:49 +00:00
Fix calling schedule task cause deadlock (#1586)
This commit is contained in:
parent
7723ed57ea
commit
b15c3a8e46
4 changed files with 55 additions and 6 deletions
|
|
@ -701,13 +701,38 @@ namespace MinecraftClient
|
|||
/// <param name="task">Task to run</param>
|
||||
public object ScheduleTask(Delegate task)
|
||||
{
|
||||
var taskAndResult = new TaskWithResult(task);
|
||||
lock (threadTasksLock)
|
||||
if (!InvokeRequired())
|
||||
{
|
||||
threadTasks.Enqueue(taskAndResult);
|
||||
return task.DynamicInvoke();
|
||||
}
|
||||
else
|
||||
{
|
||||
var taskAndResult = new TaskWithResult(task);
|
||||
lock (threadTasksLock)
|
||||
{
|
||||
threadTasks.Enqueue(taskAndResult);
|
||||
}
|
||||
taskAndResult.Block();
|
||||
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;
|
||||
}
|
||||
taskAndResult.Block();
|
||||
return taskAndResult.Result;
|
||||
}
|
||||
|
||||
#region Management: Load/Unload ChatBots and Enable/Disable settings
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue