使用Task Parallel库时如何解决跨线程错误?

时间:2018-10-09 06:11:10

标签: c# .net asynchronous async-await task-parallel-library

 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,但是没有提到如何克服这个问题。

2 个答案:

答案 0 :(得分:3)

在任何操作系统中,您都无法从另一个线程修改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线程

答案 1 :(得分:0)

您的control对象可以被多个线程同时访问。要解决此问题,您必须像这样使用MethodInvoker

function A(){
    List<string> lstResult =Getlist();
    Invoke(new MethodInvoker(delegate
    {
        control.DataSource =lstResult ;
        control.Databind();
    }));
}