c# - 使用任务并行库时如何修复跨线程错误?
问题描述
List<Task> tasks = new List<Task>();
tasks.Add(Task.Run(() => functionA()));
tasks.Add(Task.Run(() => functionB()));
tasks.Add(Task.Run(() => functionC()));
function A(){
List<string>lstResult =Get list ();
control.DataSource =lstResult ;
control.Databind();
}
function B(){
List<string>lstResult =Get list ();
control.DataSource =lstResult ;
control.Databind();
}
function C(){
List<string>lstResult =Get list ();
control.DataSource =lstResult ;
control.Databind();
}
在这里,由于并发问题,我得到了 Stack Empty 异常。这个怎么解决。我遇到了这个Stack Empty Excetpion 但没有提到如何克服这个问题。
解决方案
您不能在任何操作系统中从另一个线程修改 UI。async/await
如果使用并在函数内部Task.Run
移动,则可以大大简化此代码,例如:
async Task functionA(){
var results= await Task.Run(()=>Getlist1();
control1.DataSource =results ;
control1.Databind();
}
async Task functionB(){
var results= await Task.Run(()=>Getlist2();
control2.DataSource =results ;
control2.Databind();
}
async Task functionC(){
var results= await Task.Run(()=>Getlist3();
control3.DataSource =results ;
control3.Databind();
}
var tasks = await Task.WhenAll( functionA(),
functionB(),
functionC());
await
等待已经异步操作完成而不阻塞。当该操作完成时,它将执行返回到原始线程,在本例中为 UI 线程
推荐阅读
- css - 为什么高像素密度的小屏幕会呈现错误的媒体查询?
- reactjs - 打字稿,样式组件错误:TS2769:没有重载匹配此调用。重载 1 of 2
- django - Docker-compose:使用 Bolt 从 Web 容器到 Neo4j 容器的 db 连接
- c# - Set-Cookie 中的 Cookie 被浏览器忽略
- jenkins - Jenkins 启动失败 - 验证您是否有足够的权限来启动系统服务
- r - 如何创建堆叠和分组图表?
- elm - 如何在 elm 中为 http get 请求编写测试
- python - 有没有办法从函数内部更改全局值?
- java - jdbcTemplate - 将字段留空
- php - PayPal Orders v2 在传递金额折扣时创建返回 422(无法处理的实体)