fix: restore DOCX workbench runtime path

This commit is contained in:
codex
2026-07-30 14:00:31 +03:00
parent dab90f0780
commit 77a62d4564
13 changed files with 381 additions and 89 deletions
@@ -0,0 +1,40 @@
using System.Collections.Concurrent;
namespace DocxWorkbench.WordInterop;
internal sealed class StaWordQueue : IDisposable
{
private readonly BlockingCollection<Action> _jobs = new();
private readonly Thread _thread;
public StaWordQueue()
{
_thread = new Thread(Run) { IsBackground = true, Name = "DocumentAutomation.Word.STA" };
_thread.SetApartmentState(ApartmentState.STA);
_thread.Start();
}
public Task<T> Enqueue<T>(Func<T> operation, CancellationToken cancellationToken)
{
var completion = new TaskCompletionSource<T>(TaskCreationOptions.RunContinuationsAsynchronously);
_jobs.Add(() =>
{
try { cancellationToken.ThrowIfCancellationRequested(); completion.SetResult(operation()); }
catch (OperationCanceledException ex) { completion.SetCanceled(ex.CancellationToken); }
catch (Exception ex) { completion.SetException(ex); }
}, cancellationToken);
return completion.Task;
}
private void Run()
{
foreach (var job in _jobs.GetConsumingEnumerable()) job();
}
public void Dispose()
{
_jobs.CompleteAdding();
if (Thread.CurrentThread != _thread) _thread.Join(TimeSpan.FromSeconds(5));
_jobs.Dispose();
}
}