线程同步对我而言并不重要。我只想了解是否有任何具体区别。 因此有人可以查看此代码并给我一些想法。所有方法都在后台执行,只是
第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()));
//}
}
答案 0 :(得分:-1)
async
关键字将指示编译器构建状态机,该状态机应为方法执行流的开头与第一个await
之间的代码,这是任意两个连续的{{1 }}之间,以及最后一个await
与方法的返回之间。
如果您不关心结果或方法完成(请注意),则方法的返回类型为await
,如果要等待执行方法的返回类型为void
。方法,但不想返回任何值;如果要等待该方法的执行并返回类型为Task
的值,则不想返回Task<T>
。
如果该方法没有T
修饰符,则它只是一个“常规”方法。