差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录前一修订版后一修订版 | 前一修订版 | ||
it:dotnet:线程保护 [2023-08-24 07:40] – goldentianya | it:dotnet:线程保护 [2023-08-24 07:44] (当前版本) – goldentianya | ||
---|---|---|---|
行 19: | 行 19: | ||
}); | }); | ||
</ | </ | ||
+ | |||
+ | ===== Dispatcher.Invoke vs BeginInvoke ===== | ||
+ | |||
使用 Dispatcher.Invoke 来实现相同的跨线程访问控制。InvokeRequired 来检查当前线程是否为主线程 如果不是,则使用 BeginInvoke 来将设置操作委托到主线程。 | 使用 Dispatcher.Invoke 来实现相同的跨线程访问控制。InvokeRequired 来检查当前线程是否为主线程 如果不是,则使用 BeginInvoke 来将设置操作委托到主线程。 | ||
行 40: | 行 43: | ||
示例使用 `BeginInvoke` 将委托放入 UI 线程的消息队列中,以确保在 UI 线程上执行操作: | 示例使用 `BeginInvoke` 将委托放入 UI 线程的消息队列中,以确保在 UI 线程上执行操作: | ||
- | ```csharp | + | |
+ | <code > | ||
if (InvokeRequired) | if (InvokeRequired) | ||
{ | { | ||
行 52: | 行 56: | ||
// 在 UI 线程上执行操作 | // 在 UI 线程上执行操作 | ||
} | } | ||
- | ``` | + | </ |
2. **`Dispatcher.Invoke`**: | 2. **`Dispatcher.Invoke`**: | ||
行 61: | 行 66: | ||
示例使用 `Dispatcher.Invoke` 在 UI 线程上执行操作,并等待其完成: | 示例使用 `Dispatcher.Invoke` 在 UI 线程上执行操作,并等待其完成: | ||
- | ```csharp | + | |
+ | < | ||
Dispatcher.Invoke(() => | Dispatcher.Invoke(() => | ||
{ | { | ||
// 在 UI 线程上执行操作 | // 在 UI 线程上执行操作 | ||
}); | }); | ||
- | ``` | + | </ |
总之,无论是 `BeginInvoke` 还是 `Dispatcher.Invoke`,它们的目标都是在 UI 线程上执行操作,确保线程安全性。选择哪种方法取决于您是否需要当前线程继续执行其他任务(使用 `BeginInvoke`),或者需要等待操作完成并获取其结果(使用 `Dispatcher.Invoke`)。 | 总之,无论是 `BeginInvoke` 还是 `Dispatcher.Invoke`,它们的目标都是在 UI 线程上执行操作,确保线程安全性。选择哪种方法取决于您是否需要当前线程继续执行其他任务(使用 `BeginInvoke`),或者需要等待操作完成并获取其结果(使用 `Dispatcher.Invoke`)。 | ||
+ | |||
+ | ===== 判断主线程 ===== | ||
+ | 在 winform 中可以使用 <color # | ||