在循环中顺序执行函数而不阻塞ui

时间:2014-08-14 09:46:53

标签: c# multithreading task

我需要一个接一个地执行3个函数。一个是等待另一个执行。那也嵌套在一个循环中。如何让循环在循环之前等待上一个任务完成。

这是我到目前为止所做的:

    private void Foo()
    {
        string[] files = GetFilesFromDir(@"C:\Bar\");
        if (files == null || files.Length < 0) { return; }

        for(int i = 0; i < files.Length; i++)
        {
            tbSked.Text = files[i];
            Task t1 = Task.Factory.StartNew(()=>LoadFile());
            t1.ContinueWith((a) => SQLUpdate());
            t1.ContinueWith((b) => RestartTimer());
        }
    }

Wich有效(不冻结UI)但是一旦执行它就会循环。

3 个答案:

答案 0 :(得分:4)

尝试这样的事情,

private void Foo()
{
    Task.Run(() => NormalMethod());
}

private void NormalMethod()
{
    string[] files = GetFilesFromDir(@"C:\Bar\");
    if (files == null || files.Length < 0) { return; }

    for (int i = 0; i < files.Length; i++)
    {
        tbSked.Text = files[i];
        LoadFile();
        SQLUpdate();
        RestartTimer();
    }
}

答案 1 :(得分:0)

可能你可以尝试这样的事情。

private async void Foo()
{
    string[] files = GetFilesFromDir(@"C:\Bar\");
    if (files == null || files.Length < 0) { return; }

    for(int i = 0; i < files.Length; i++)
    {
        tbSked.Text = files[i];
        Task t1 = Task.Factory.StartNew(()=>LoadFile());
        t1.ContinueWith((a) => SQLUpdate());
        var continuationTask = t1.ContinueWith((b) => RestartTimer());
        await continuationTask;
    }
}

答案 2 :(得分:0)

这是预期的行为。您在循环中定义任务,它只运行循环。如果你想让循环逐个运行任务,我建议你开始一个新的Thread,在那个线程中运行整个循环,忘掉任务。例如:

private void Foo()
{
    string[] files = GetFilesFromDir(@"C:\Bar\");
    if (files == null || files.Length < 0) { return; }
    new Thread(()=>{
      for(int i = 0; i < files.Length; i++)
      {
        tbSked.Text = files[i]; //if this one is a text box, dispatch it in the main thread.
        LoadFile();
        SQLUpdate();
        RestartTimer();
      }
    }).Start();
}