【发布时间】:2017-04-19 06:40:20
【问题描述】:
我有控制台应用程序,其中有 2 个步骤。 Step1 和 Step2。我希望 Step 1 在主线程上运行,Step 2 在后台的不同线程上运行,并且我使用 C# task object 来实现相同的目的。
见下面代码sn-p:
public static Task PrintCount()
{
Console.WriteLine("Step 2");
for (var i = 1; i <= 1000; i++)
{
Thread.Sleep(1000);
Console.WriteLine(i);
}
return Task.FromResult(0);
}
static void Main(string[] args)
{
Task.Run(() => PrintCount());
Console.WriteLine("Step 1");
Console.Read();
}
这工作得很好如果我使用 Task.Run().
当我像下面提到的那样不使用它时,它会作为同步操作运行。
var taskResult = PrintCount();
在这种情况下,Step 2会先执行,完成1000次迭代,直到方法完成,然后才会执行Step 1。
问题是——我如何在不使用 Task.Run() 的情况下运行第 2 步方法,但我仍然想在不同线程上以异步方式运行第 2 步方法。
我相信 PrintCount() 返回 Task 对象,如果我们不等待它,它将异步运行,但它的行为不是那样。
您能否建议我如何在不使用 Task.Run() 的情况下使用 Task 方法在不同的线程上运行 DoSomehing()。
提前致谢!
更新:
public static async Task PrintCount()
{
await Task.Delay(TimeSpan.FromSeconds(3));
Console.WriteLine("Step 2");
for (var i = 1; i <= 1000; i++)
{
Thread.Sleep(1000);
Console.WriteLine(i);
}
}
这将在不同的线程上运行。
我的称呼没有改变。
var taskResult = PrintCount();
【问题讨论】:
-
那么发生了什么?你已经说过什么是有效的,但你还没有说你当前的代码会发生什么。请注意,您实际上并不需要调用
Func<Task>的重载 - 您可以将PrintCount方法更改为void方法,然后调用Task.Run((Action) PrintCount);。 -
这与
asp.net-mvc-4标签有什么关系也不清楚...... -
但是为什么你不想使用
Task.Run?这通常是您开始任务的方式。Task.Run做了什么你不喜欢的事情?你说它“不像那样表现”(异步),但它确实似乎适合我。是什么让你认为不是?同样,您并没有准确地说出您所观察到的出乎意料的内容。 -
@DamianT:
PrintCount()返回的任务在这里基本无关。 delegate 在不同的线程中执行,同步调用PrintCount()。但是不需要额外的间接级别,当您可以让PrintCount返回void并像我之前展示的那样异步执行它时。你仍然没有解释你为什么不想使用Task.Run。 -
此时,我建议删除该问题,因为它基于一个错误的前提。
标签: c# multithreading c#-4.0 task-parallel-library