gpt4 book ai didi

.net - 是否有 Control.BeginInvoke 的变体可以在句柄销毁之前/之后工作?

转载 作者:行者123 更新时间:2023-12-05 00:39:19 25 4
gpt4 key购买 nike

我有一个显示底层异步对象状态的控件。该对象引发到达表单的事件,在那里它们基本上排队并最终使用 BeginInvoke 调用。

当控制被处置时出现问题。因为事情是异步发生的,这意味着在处理过程中事件回调总是可能排队,我有时会得到一个 InvalidOperationException(在创建窗口句柄之前不能在控件上调用 Invoke 或 BeginInvoke。)。

这不是我想要的行为。即使控件已被释放,我也希望回调执行(即使这会导致回调中的异常;这对我来说是一个更有用的异常!)。我想在每个回调中处理已处理的状态行为(通常只是跳过如果已处理,但有时不会[例如,一个控件记录事件(可选到文件)并且我不想丢失日志数据!]。)。

有没有一种方法可以按我想要的方式工作?我可以自己写一个非脆性的吗?

最佳答案

试试 SynchronizationContext.Current反而。这有 PostSend大致映射到 BeginInvoke 的成员和 InvokeControl .只要 UI 线程相对于特定控件处于事件状态,这些操作就会继续运行。

型号SynchronizationContext并非特定于 WinForms,利用它的解决方案将可移植到其他框架,例如 WPF。

例如。

开始调用代码

void OnButtonClicked() {
DoBackgroundOperation(this);
}

void DoBackgroundOperation(ISynchronizedInvoke invoke) {
ThreadPool.QueueUserWorkItem(delegate {
...
delegate.BeginInovke(new MethodInvoker(this.BackgroundOperationComplete), null);
});
}

同步上下文代码
void OnButtonClicked() {
DoBackgroundOperation(SynchronizationContext.Current);
}

void DoBackgroundOperation(SynchronizationContext context) {
ThreadPool.QueueUserWorkItem(delegate {
...
context.Post(delegate { this.BackgroundOperationComplete() }, null);
});
}

关于.net - 是否有 Control.BeginInvoke 的变体可以在句柄销毁之前/之后工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4513761/

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