- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在任务中运行了这段代码:
foreach (a in as) // yield return
{
component.Notify(...); // This component locks internally.
component.PropertyChanged += (o, args) =>
{
// Cancel out of task by adding another screen.
MainWindow.AddContent(new OtherComponent()); // WPF
}
}
现在,当任务在错误的时刻取消时,.Notify 函数在它已经取消后仍会被调用,因为任务仍在运行。我想要的是,当调用 .PropertyChanged 事件时,之后不应再调用 .Notify。我当然可以在循环中用一个相当简单的 bool 值来解决这个问题,它会在下一次迭代中取消这个,比如:
foreach (a in as) // yield return
{
if (requestCancel)
return;
component.Notify(...); // This component locks internally.
component.PropertyChanged += (o, args) =>
{
requestCancel = true;
}
}
这里的一个问题是 foreach (a in as)
语句可能需要一段时间才能返回下一次迭代,因此它可能需要很长时间才能真正被取消。我尝试在 requestCancel 操作周围加锁,然后检查 requestCancel 是否为真,但这会导致死锁,因为 component
在内部对所有操作使用锁。我无法更改它,因为它是第三方组件。我还尝试了一个信号量,一个读写器锁,但我总是以死锁告终。比如这样:
foreach (a in as) // yield return
{
_semaphore.WaitOne();
if (requestCancel)
return;
component.Notify(...); // This component locks internally.
component.PropertyChanged += (o, args) =>
{
_semaphore.WaitOne();
requestCancel = true;
}
_semaphore.Release();
}
基本上,.Notify 被阻止是因为 PropertyChanged 仍在执行(由于两者都在内部使用锁)。这反过来导致 PropertyChanged 正在等待信号量或读写器锁,而另一个 block 永远不会释放信号量,因为它正在等待 PropertyChanged 由于锁定而完成。
我真的需要尽快取消这段代码,并且在用户取消后无法再调用 .Notify。在摆弄了一段时间之后,我的想法用完了。如果有任何不清楚的地方,请不要犹豫,询问更多信息。
最佳答案
我认为,所有代码都在一个线程上执行,如下所示:
在那种情况下,信号量将始终阻塞您的代码,因为在第 2 步中您等待信号量发出信号,但这只会在第 3 步之后发生。试试这个:
foreach (a in as) // yield return
{
component.PropertyChanged += (o, args) => requestCancel = true;
component.Notify(...);
// break out of the loop here to prevent getting next item from the enumerator
if (requestCancel)
break;
}
// do whatever you want to do after cancel
if (requestCancel)
MainWindow.AddContent(new OtherComponent());
关于带锁的C#多线程导致死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21146795/
我有类似下面的代码: ... id: myComponent signal updateState() property variant modelList: [] Repeater { mo
我正在处理一些我无法展示的私有(private)代码,但我已经制作了一些示例代码来描述我的问题: 主.c: #include #include #include #include typede
这个问题在这里已经有了答案: 关闭10 年前。 Possible Duplicate: what are the differences in die() and exit() in PHP? 我想
在编写 Perl 模块时,在模块内部使用 croak/die 是一个好习惯吗? 毕竟,如果调用者不使用 eval block ,模块可能会使调用它的程序崩溃。 在这些情况下,最佳做法是什么? 最佳答案
我有一些搜索线程正在存储结果。我知道当线程启动时,JVM native 代码会代理在操作系统上创建新 native 线程的请求。这需要 JVM 之外的一些内存。当线程终止并且我保留对它的引用并将其用作
我刚刚花了很多时间调试一个我追溯到 wantarray() 的问题。 .我已将其提炼为这个测试用例。 (忽略 $! 在这种情况下不会有任何有用信息的事实)。我想知道为什么wantarray在第二个示例
我看到一些代码是这样做的: if(something){ echo 'exit from program'; die; } ...more code 和其他只使用 die 的人: if
我正在尝试将此表格用于: 如果任何 $_POST 变量等于任何其他 $_POST 变量抛出错误。 如果只有几个,那不是问题,但我有大约 20 个左右所以如果我想这样做,我将不得不像这样 但这
每次我运行: hadoop dfsadmin -report 我得到以下输出: Configured Capacity: 0 (0 KB) Present Capacity: 0 (0 KB) DFS
我是一名优秀的程序员,十分优秀!