差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
后一修订版
前一修订版
it:dotnet:线程保护 [2023-08-24 07:40] goldentianyait:dotnet:线程保护 [2023-08-24 07:44] (当前版本) goldentianya
行 19: 行 19:
 }); });
 </code> </code>
 +
 +===== 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 线程上执行操作
 } }
-```+</code> 
  
 2. **`Dispatcher.Invoke`**: 2. **`Dispatcher.Invoke`**:
行 61: 行 66:
 示例使用 `Dispatcher.Invoke` 在 UI 线程上执行操作,并等待其完成: 示例使用 `Dispatcher.Invoke` 在 UI 线程上执行操作,并等待其完成:
  
-```csharp+ 
 +<code>
 Dispatcher.Invoke(() => Dispatcher.Invoke(() =>
 { {
     // 在 UI 线程上执行操作     // 在 UI 线程上执行操作
 }); });
-```+</code> 
  
 总之,无论是 `BeginInvoke` 还是 `Dispatcher.Invoke`,它们的目标都是在 UI 线程上执行操作,确保线程安全性。选择哪种方法取决于您是否需要当前线程继续执行其他任务(使用 `BeginInvoke`),或者需要等待操作完成并获取其结果(使用 `Dispatcher.Invoke`)。 总之,无论是 `BeginInvoke` 还是 `Dispatcher.Invoke`,它们的目标都是在 UI 线程上执行操作,确保线程安全性。选择哪种方法取决于您是否需要当前线程继续执行其他任务(使用 `BeginInvoke`),或者需要等待操作完成并获取其结果(使用 `Dispatcher.Invoke`)。
 +
 +===== 判断主线程 =====
 +在 winform 中可以使用 <color #ff7f27>''%%InvokeRequired%%''</color>,在WPF中可以使用 <color #ff7f27>''%%Dispatcher.CheckAccess()%%''</color>
  
it/dotnet/线程保护.1692862850.txt.gz · 最后更改: 2023-08-24 07:40 由 goldentianya
回到顶部
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0