我试图从异步方法执行两个不同的任务,但我的第二个任务应该只从第一个结束的地方开始。我试过使用ContinueWith,但没有成功。这是我的示例代码:
class Program
{
static List<string> GlobalList1 = null;
static List<string> GlobalList2 = null;
static void Main(string[] args)
{
Task firstTask = new Task(DoFirstThing);
firstTask.Start();
firstTask.Wait();
Task secondTask = firstTask.ContinueWith(o => DoSecondThing(), TaskContinuationOptions.ExecuteSynchronously);
secondTask.Wait();
Console.ReadKey();
}
public async static void DoFirstThing()
{
Console.WriteLine("Doing first...");
Task t = new Task(FirstThing);
t.Start();
await t;
}
public async static void DoSecondThing()
{
Console.WriteLine("Doing second...");
Task t = new Task(SecondThing);
t.Start();
await t;
}
private async static void FirstThing()
{
Console.WriteLine("In First..");
Task t = new Task(() =>
{
List<string> list = new List<string>();
for (int i = 0; i < 1000; i++)
{
list.Add(string.Format("Testing:{0}", i));
}
System.Threading.Thread.Sleep(2000);
GlobalList1 = list;
});
t.Start();
await t;
}
private async static void SecondThing()
{
Console.WriteLine("In Second...");
Task t = new Task(() =>
{
GlobalList2 = new List<string>();
for (int i = 0; i < GlobalList1.Count; i++)
{
GlobalList2.Add(GlobalList1[i].ToString() + " - testing");
}
});
t.Start();
await t;
}
}
您可能会从控制台输出中注意到,任务保持在同一时间运行。有可能改变这种行为吗?
我的第二个任务应该只从第一个结束的地方开始
然后你应该真诚地等待它结束。目前,您没有这样做。您正在等待DoFirstThing
方法返回,但它会在完成等待t
之前返回。
如果不是构建新的Task
然后调用Start()
,而是调用Task.Run
并提供Func<T>
,则可以等待代理任务完成:
static void Main(string[] args)
{
Task firstTask = Task.Run(DoFirstThing);
firstTask.Wait();
...
}
public async static Task DoFirstThing()
{
Console.WriteLine("Doing first...");
Task t = Task.Run(FirstThing);
await t;
}
private async static Task FirstThing() { ... }
现在,在FirstThing()
异步操作真正完成之前,Wait()
调用不会完成。
基本上,在几乎所有情况下都要避免使用async void
方法。
也就是说:
- 显式启动任务而不仅仅是调用异步方法通常不是一个好主意
- 显式调用
Wait()
而不是等待任务也不是一个好主意,因为如果给定任务有一个必须在同一线程上运行的延续,它可能会死锁