gpt4 book ai didi

c# - 如何编写可中止的同步方法?

转载 作者:行者123 更新时间:2023-11-30 17:19:21 26 4
gpt4 key购买 nike

我需要同步运行一个方法列表,并能够停止执行列表。在执行之前使用重置事件很容易停止循环(请参阅 Execute 中的第一行)。

如何同时等待来自 action.Execute()action.Execute() 的响应?

private ManualResetEvent _abortingToken = new ManualResetEvent(false);
private List<IAction> _actions;

public void Abort()
{
_abortingToken.Set();
}

public void Execute()
{
foreach (var action in _actions)
{
if (_abortingToken.WaitOne(0))
break; // Execution aborted.

action.Execute(); // Somehow, I need to call this without blocking

while (/*Execute not finished*/)
{
if (_abortingToken.WaitOne(1))
action.Abort();
}
}
}

我认为使用 Tasks 进行预成型很容易,但不幸的是我使用的是 .net 3.5。


编辑解决方案灵感来自 SLaks answer :

public void Execute()
{
Action execute = null;
IAsyncResult result = null;

foreach (var action in _actions)
{
execute = new Action(scriptCommand.Execute);

if (_abortingToken.WaitOne(0))
break; // Execution aborted.

result = execute.BeginInvoke(null, null);

while (!result.IsCompleted)
{
if (_abortingToken.WaitOne(10))
{
action.Abort();
break;
}
}

execute.EndInvoke(result);
}
}

最佳答案

这与同步性相反。
您需要在后台线程上运行该方法。

例如,您可以使用 Delegate.BeginInvoke 调用该方法,然后检查 IAsyncResult.IsCompleted。 (并确保之后调用 EndInvoke)

关于c# - 如何编写可中止的同步方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4984732/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com