问题描述
我正在尝试释放 TPL 任务中的锁,该任务卡在对线程不安全的第三方 COM 组件的调用中。
我需要释放锁,因为任务是可排队的(当组件恢复时,它必须可供其他排队的任务使用)
代码如下:
private Task RunQueueableTask()
{
var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromMinutes(5));
var cancellationToken = cancellationTokenSource.Token;
return
Task
.Run(
() =>
{
Monitor.Enter(_lock);
{
try
{
cancellationToken.Register(() =>
{
Monitor.Exit(_lock);
},true); //"true" ensures that the target syncContext is the active SynchronizationContext.Current
//Blocked thread unsafe third party COM component call
var result = ThirdPartyCOMComponent.Call();
}
finally
{
Monitor.Exit(_lock);
}
}
},cancellationToken)
.ContinueWith(t =>
{
cancellationTokenSource.dispose();
});
}
然而,可能因为它无法获取syncContext,所以没有调用cancellationToken.Register 回调。
现在我使用 Monitor.TryEnter 以便后续任务不会被阻止。
private static readonly object _lock = new object();
private Task RunQueueableTask()
{
var cancellationTokenSource = new CancellationTokenSource();
var cancellationToken = cancellationTokenSource.Token;
return
Task
.Run(
() =>
{
if (Monitor.TryEnter(_lock,TimeSpan.FromMinutes(5)))
{
try
{
//Blocked thread unsafe third party COM component call
var result = ThirdPartyCOMComponent.Call();
}
finally
{
Monitor.Exit(_lock);
}
}
else
{
cancellationTokenSource.Cancel();
}
},cancellationToken)
.ContinueWith(t =>
{
cancellationTokenSource.dispose();
});
}
专家有什么建议吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)