WPF中线程的一个非常基本的解释?

use*_*387 2 .net c# wpf multithreading

我对WPF非常新.我在互联网上查看了几个关于线程的示例和教程.他们有自己的描述方式.但对于像我这样天真的人,我想用自己的风格来理解.

我可以使用数据库更新功能开始我的第一次线程.

这是场景:

我有大量数据要插入数据库中.现在让我们假设以下代码(一旦我点击"继续"按钮,这个过程就会启动:

int initial = 0;
int maxData = 10
while (initial<maxData) {
   //Database query here
}
Run Code Online (Sandbox Code Playgroud)

上面的过程将在不同的线程中运行.

接下来我在主窗口中有一个"标签".对于每个数据库查询,我想在标签中显示一些消息.

例如,

// this will happen in default UI thread.
label.Content = "Updating"; // Specifically for @TomTom ;)
Run Code Online (Sandbox Code Playgroud)

编辑:我做了以下事情:

var task = new Task(() =>
    {
       for (int i=0; i<10; i++) {
          //Create new Grid HERE
          // Add Table with some dynamic data here..
          // print the above Grid here.
        }

    });

task.ContinueWith((previousTask) =>
    {
        label.Content = printerStatus(); // will return "Out of Paper", "printing", "Paper jam", etc.
    },
    TaskScheduler.FromCurrentSynchronizationContext());

label.Content = "Sending to printer";
Run Code Online (Sandbox Code Playgroud)

该程序将返回错误说"调用线程必须是STA,因为许多UI组件需要这个."

我不知道接下来该做什么.请帮忙!

Har*_*san 9

您需要将BackgroundWorker用于长时间运行的任务,并使用Dispatcher在其间更新UI

 //create background worker
 BackgroundWorker worker = new BackgroundWorker();
 //assign it work
 worker.DoWork += new DoWorkEventHandler(worker_DoWork);
 //start work
 worker.RunWorkerAsync();


//this work will be done in background
void worker_DoWork(object sender, DoWorkEventArgs e)
{
    SET initial = 0;
    SET maxData = 1000
    DO UNTIL initial <1000
   CREATE db query "INSERT INTO (col1,col2,col3) VALUES(value1,value2,value3);"

   //in between your work do this to update label
   label.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal,new Action(delegate()
        {
         Label.Content = "SomeValue";
        }
        ));
   END DO
  }
Run Code Online (Sandbox Code Playgroud)