【发布时间】:2018-11-25 04:53:51
【问题描述】:
线程同步对我来说并不重要。我只是想了解是否有任何具体区别。 所以有人可以查看这段代码并给我一些想法。所有方法都在后台根据需要执行,我只是
第 1 部分。
在程序DoSomeAsyncStuff() 中删除async 然后
Task.Run(() => DoSomeAsyncStuff("a"));会阻塞执行,所以我需要异步,
将DoSomeAsyncStuff 与DoSomeAsyncStuffV2 进行比较是一次实现优于另一个实现吗?
更新:让我们专注于
第 2 部分。
private async Task Do..() 与 private Task Do..() 有什么区别?
基于这个https://stackoverflow.com/a/48392684/1818723我认为可能没有,但是如果你看看这两种方法的实现,一个正在等待任务完成,另一个正在返回任务
public class ServiceX
{
public Task SomeServiceEntryMethod()
{
Console.WriteLine("Multithreading started");
Thread.Sleep(1);
List<Task> tasks = new List<Task>();
for (int i = 0; i < 8; i++)
{
//I can use this version
//var t = DoSomeAsyncStuff(i.ToString());
//or I can use this version both seems to have same results
var t = DoSomeAsyncStuffV2(i.ToString());
tasks.Add(t);
}
//in the calling method I can await for all task to complete the for loop spins a few async tasks
return Task.WhenAll(tasks);
}
private async Task DoSomeAsyncStuffV2(string text)
{
await Task.Run(() =>
{
if (text == "0")
Thread.Sleep(1000);
Console.WriteLine("test " + text + " " + Thread.CurrentThread.ManagedThreadId.ToString());
});
}
private Task DoSomeAsyncStuff(string text)
{
return Task.Run(() =>
{
if (text == "0")
Thread.Sleep(1000);
Console.WriteLine("test " + text + " " + Thread.CurrentThread.ManagedThreadId.ToString());
});
}
}
class Program
{
public static async Task Main(string[] args)
{
//Task.Run(() => DoSomeAsyncStuff("a"));
//Task.Run(() => DoSomeAsyncStuff("b"));
//DoSomeAsyncStuffV2("c");
//DoSomeAsyncStuffV2("d");
ServiceX x = new ServiceX();
await x.SomeServiceEntryMethod();
}
//private static async void DoSomeAsyncStuff(string text)
//{
//Console.WriteLine("test " + text + " " + Thread.CurrentThread.ManagedThreadId.ToString());
//}
//private static async void DoSomeAsyncStuffV2(string text)
//{
//await Task.Run(() => Console.WriteLine("test " + text + " " + Thread.CurrentThread.ManagedThreadId.ToString()));
//}
}
【问题讨论】:
-
1.
Task.Run(() => DoSomeAsyncStuff("a"));将阻止执行 - 它不应该阻止执行。无论调用结果如何,Main都会继续执行。 -
你确定最后一条评论吗,@Fabio?您不会将状态机与同步上下文混淆吗?
-
@PauloMorgado,StateMachine,谢谢
标签: c# .net multithreading async-await task