Use long running task for plugin ctor (#2406)

This commit is contained in:
srkizer 2025-09-30 01:09:02 +09:00 committed by GitHub
parent d61a35b81f
commit aa3d6c3efe
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -112,27 +112,15 @@ internal class ServiceContainer : IServiceProvider, IServiceType
errorStep = "property injection";
await this.InjectProperties(instance, scopedObjects, scope);
// Invoke ctor from a separate thread (LongRunning will spawn a new one)
// so that it does not count towards thread pool active threads cap.
// Plugin ctor can block to wait for Tasks, as we currently do not support asynchronous plugin init.
errorStep = "ctor invocation";
var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var thr = new Thread(
() =>
{
try
{
ctor.Invoke(instance, resolvedParams);
}
catch (Exception e)
{
tcs.SetException(e);
return;
}
tcs.SetResult();
});
thr.Start();
await tcs.Task.ConfigureAwait(false);
thr.Join();
await Task.Factory.StartNew(
() => ctor.Invoke(instance, resolvedParams),
CancellationToken.None,
TaskCreationOptions.LongRunning,
TaskScheduler.Default).ConfigureAwait(false);
return instance;
}