C# 与.net framework 4并行的任务

C# 与.net framework 4并行的任务,c#,.net,C#,.net,我正在研究并行性,想知道您建议我使用哪种方式访问其他thead元素,例如,imagima我将用一些名称填充一个组合框,查询我将并行执行但无法执行组合框的数据库。从任务中添加(结果),您建议我使用哪种方式 一个简单的例子来理解我的问题: private void button1_Click (object sender, EventArgs e) { Task task = new Task (new Action (Count));

我正在研究并行性,想知道您建议我使用哪种方式访问其他thead元素,例如,imagima我将用一些名称填充一个组合框,查询我将并行执行但无法执行组合框的数据库。从任务中添加(结果),您建议我使用哪种方式

一个简单的例子来理解我的问题:

 private void button1_Click (object sender, EventArgs e)
         {
             Task task = new Task (new Action (Count));
             task.Start ();
         }


         void Count ()
         {
             for (int i = 0; i <99; i + +)
             {
                 Thread.Sleep (1);
                 progressBar1.Value = i;
             }
         }
private void按钮1\u单击(对象发送者,事件参数e)
{
任务任务=新任务(新操作(计数));
task.Start();
}
无效计数()
{

对于(int i=0;i只是一个快速注释……在WINFALSE中的UI只能从UI线程中更新。也许您应该考虑使用<代码>控件。调用KINKE/<代码>更新您的PrimeSrBAR.< /P> < P>只是一个快速注释……WIN窗体中的UI只能从UI线程中更新。也许您应该考虑使用<代码>控件。r progressBar1.

您不能直接访问另一个线程上的控件。必须先调用它们。请阅读本文:

这是关于如果你把这篇文章翻译成你自己用的话会是什么样子的:(未测试)

委托void SetProgressBarCallback();
私有void SetProgressBar()
{
//invokererequired比较
//向创建线程的线程ID调用线程。
//如果这些线程不同,则返回true。
if(this.progressBar1.invokererequired)
{   
SetProgressBarCallback d=新的SettProgressBarCallback(SetProgressBar);
本节引用(d);
}
其他的
{

对于(int i=0;i您不能直接访问另一个线程上的控件。必须先调用它们。请阅读本文:

这是关于如果你把这篇文章翻译成你自己用的话会是什么样子的:(未测试)

委托void SetProgressBarCallback();
私有void SetProgressBar()
{
//invokererequired比较
//向创建线程的线程ID调用线程。
//如果这些线程不同,则返回true。
if(this.progressBar1.invokererequired)
{   
SetProgressBarCallback d=新的SettProgressBarCallback(SetProgressBar);
本节引用(d);
}
其他的
{

对于(int i=0;i如果要计划访问UI控件的任务,则需要将当前同步上下文传递给计划程序。如果这样做,计划程序将确保在正确的线程上执行任务。例如

var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();

Task.Factory.StartNew(() => {
    // code that access UI controls
}, uiScheduler);

有关更多信息,请参见

如果要计划访问UI控件的任务,则需要将当前同步上下文传递给计划程序。如果这样做,计划程序将确保在正确的线程上执行任务。例如

var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();

Task.Factory.StartNew(() => {
    // code that access UI controls
}, uiScheduler);

有关更多信息,请参见

Ryan的回答是正确的,但他将睡眠放在了调用中,这导致程序挂起。下面的示例使用了他所做的相同操作,但没有将睡眠放在调用中

     private void button1_Click (object sender, EventArgs e)
     {
         Task task = new Task (new Action (Count));
         task.Start ();
     }


     void Count ()
     {
         for (int i = 0; i <99; i + +)
         {
             Thread.Sleep (1);
             if(progressBar1.InvokeRequired)
             {
                  int j = i; //This is required to capture the variable, if you do not do this
                             // the delegate may not have the correct value when you run it;
                  progressBar1.Invoke(new Action(() => progressBar1.Value = j));
             }
             else
             {
                 progressBar1.Value = i;
             }
         }
     }
private void按钮1\u单击(对象发送者,事件参数e)
{
任务任务=新任务(新操作(计数));
task.Start();
}
无效计数()
{
对于(inti=0;i.1.Value=j));
}
其他的
{
progressBar1.值=i;
}
}
}

您必须执行
int j=i
才能执行,否则它可能会在循环中为i带来错误的值。

Ryan的回答是正确的,但他将睡眠放在调用中,这导致程序挂起。下面的示例使用了他所做的相同操作,但没有将睡眠放在调用中

     private void button1_Click (object sender, EventArgs e)
     {
         Task task = new Task (new Action (Count));
         task.Start ();
     }


     void Count ()
     {
         for (int i = 0; i <99; i + +)
         {
             Thread.Sleep (1);
             if(progressBar1.InvokeRequired)
             {
                  int j = i; //This is required to capture the variable, if you do not do this
                             // the delegate may not have the correct value when you run it;
                  progressBar1.Invoke(new Action(() => progressBar1.Value = j));
             }
             else
             {
                 progressBar1.Value = i;
             }
         }
     }
private void按钮1\u单击(对象发送者,事件参数e)
{
任务任务=新任务(新操作(计数));
task.Start();
}
无效计数()
{
对于(inti=0;i.1.Value=j));
}
其他的
{
progressBar1.值=i;
}
}
}

您必须执行
int j=i
才能执行,否则它可能会在循环中为i带来错误的值。

和或多或少的结果?progressBar1.Invoke(…)和或多或少的结果?progressBar1.Invoke(…)您会遇到什么错误?这可能会为指向点的答案提供线索。您会遇到什么错误?这可能会为指向点的答案提供线索。即使您没有使用backgroundworker对象,您仍然在一个不在UI线程上的线程中工作。这要求您以本文中描述的相同方式调用控件。它是由于调用内的睡眠而冻结。有关解决方法,请参阅我的答案。即使您没有使用backgroundworker对象,您仍然在UI线程之外的线程中工作。这要求您以本文中描述的相同方式调用控件。由于调用内的睡眠而冻结。请参阅我的答案为了解决问题。