我需要一个接一个地执行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)但是一旦执行它就会循环。
答案 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();
}