Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何修复使用任务并行库时的跨线程错误? List tasks=newlist(); tasks.Add(Task.Run(()=>function()); tasks.Add(Task.Run(()=>functionB()); tasks.Add(Task.Run(()=>functionC()); 函数A(){ ListlstResult=Get list(); control.DataSource=lstreult; control.Databind(); } 函数B(){ ListlstResult=Get list(); control.DataSource=lstreult; control.Databind(); } 函数C(){ ListlstResult=Get list(); control.DataSource=lstreult; control.Databind(); }_C#_.net_Asynchronous_Async Await_Task Parallel Library - Fatal编程技术网

C# 如何修复使用任务并行库时的跨线程错误? List tasks=newlist(); tasks.Add(Task.Run(()=>function()); tasks.Add(Task.Run(()=>functionB()); tasks.Add(Task.Run(()=>functionC()); 函数A(){ ListlstResult=Get list(); control.DataSource=lstreult; control.Databind(); } 函数B(){ ListlstResult=Get list(); control.DataSource=lstreult; control.Databind(); } 函数C(){ ListlstResult=Get list(); control.DataSource=lstreult; control.Databind(); }

C# 如何修复使用任务并行库时的跨线程错误? List tasks=newlist(); tasks.Add(Task.Run(()=>function()); tasks.Add(Task.Run(()=>functionB()); tasks.Add(Task.Run(()=>functionC()); 函数A(){ ListlstResult=Get list(); control.DataSource=lstreult; control.Databind(); } 函数B(){ ListlstResult=Get list(); control.DataSource=lstreult; control.Databind(); } 函数C(){ ListlstResult=Get list(); control.DataSource=lstreult; control.Databind(); },c#,.net,asynchronous,async-await,task-parallel-library,C#,.net,Asynchronous,Async Await,Task Parallel Library,这里,由于并发问题,我得到了堆栈空异常。如何解决这个问题。我遇到过这个问题,但没有提到如何克服这个问题 您的控件对象可以由多个线程同时访问。要解决此问题,您必须像这样使用MethodInvoker: List<Task> tasks = new List<Task>(); tasks.Add(Task.Run(() => functionA())); tasks.Add(Task.Run(() => functionB())); tasks.Add(T

这里,由于并发问题,我得到了堆栈空异常。如何解决这个问题。我遇到过这个问题,但没有提到如何克服这个问题

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

 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();
    }
函数A(){
List lstreult=Getlist();
调用(新方法调用器(委托
{
control.DataSource=lstreult;
control.Databind();
}));
}

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

 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();
    }
函数A(){
List lstreult=Getlist();
调用(新方法调用器(委托
{
control.DataSource=lstreult;
control.Databind();
}));
}

在任何操作系统中,都不能从其他线程修改UI。如果使用
async/await
,并且
Task.Run
在函数内部移动,则此代码可以简化很多,例如:

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

wait
等待已经异步的操作在不阻塞的情况下完成。当该操作完成时,它会将执行返回到原始线程,在这种情况下,UI线程在任何操作系统中都不能从另一个线程修改UI。如果使用
async/await
,并且
Task.Run
在函数内部移动,则此代码可以简化很多,例如:

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

wait
等待已经异步的操作在不阻塞的情况下完成。当该操作完成时,它会将执行返回到原始线程,在这种情况下,UI线程

您无法更新线程池线程上的控件,这将不起作用,更新主线程上的控件您的用例是什么,为什么在三个不同的任务中更新相同的控件?这些是不同的下拉列表。不每次更新相同的下拉列表。
async/await
可以解决此问题。不要在整个方法上使用
Task.Run
,只在实际的长时间运行的作业上使用它,例如
var results=wait Task.Run(()=>Getlist();
。你也应该清理UI更新代码。你真的想只保留最后的UI更改吗?@HemanthKrishna顺便说一句,这与“堆栈为空”无关异常。此代码根本不会引发该异常。实际异常存在许多重复项,表示您无法从另一个线程更新UI,以及如何解决此问题您无法更新线程池线程上的控件,这将不起作用,更新主线程上的控件您的用例是什么,同一个控件是什么在三个不同的任务中更新?这些是不同的下拉列表。不每次更新相同的下拉列表。
async/await
可以解决此问题。不要在整个方法中使用
Task.Run
,而只在实际的长时间运行的作业中使用它,例如
var results=await Task.Run(()=>Getlist()
。你也应该清理UI更新代码。你真的想只保留最后的UI更改吗?@HemanthKrishna顺便说一句,这与“堆栈为空”无关异常。此代码根本不会引发该异常。实际异常存在许多重复项,这些重复项表示您无法从另一个线程更新UI,以及如何修复此
Getlist()
应移出
方法调用程序
,该程序可在单独的线程池线程上执行。我使用的控件是Telerik Radcombox控件,它没有调用功能。是否有其他替代方法?是的,您应该定义委托:。@koviroli调用不是这样工作的,很容易导致死锁s、 应该在要更新的控件上调用它。在启用
async/await
时也不需要它available@PanagiotisKanavos谢谢,下次我会知道的。
Getlist()
应移出
方法调用程序
,该程序可在单独的线程池线程上执行。我使用的控件是Telerik Radcombox控件,它没有调用功能。是否有其他替代方法?是的,您应该定义委托:。@koviroli调用不是这样工作的,很容易导致死锁s、 应该在要更新的控件上调用它。在启用
async/await
时也不需要它available@PanagiotisKanavos谢谢,下次我会知道的。