并发是在不同的线程上并行运行两个任务.但是,异步方法并行运行,但在同一个线程上运行.这是如何实现的?那么,并行性呢?
这3个概念之间有什么区别?
我一直在考虑C#5中新的异步内容,并提出了一个特别的问题.
我知道await关键字是一个简洁的编译器技巧/语法糖来实现连续传递,其中方法的其余部分被分解为Task对象并排队以按顺序运行,但是控制返回到调用方法.
我的问题是,我听说目前这一切都在一个线程上.这是否意味着这种异步内容实际上只是将连续代码转换为Task对象然后Application.DoEvents()在每个任务完成之后调用,然后再开始下一个任务?
或者我错过了什么?(问题的这一部分是修辞 - 我完全清楚我错过了什么 :))
我想等待一个进程完成,但process.WaitForExit()挂起我的GUI.是否有基于事件的方式,或者我是否需要生成一个线程来阻止直到退出,然后自己委托事件?
我在一段代码中遇到了僵局问题.值得庆幸的是,我已经能够在下面的例子中重现这个问题.作为普通的.Net Core 2.0控制台应用程序运行.
class Class2
{
static void Main(string[] args)
{
Task.Run(MainAsync);
Console.WriteLine("Press any key...");
Console.ReadKey();
}
static async Task MainAsync()
{
await StartAsync();
//await Task.Delay(1); //a little delay makes it working
Stop();
}
static async Task StartAsync()
{
var tcs = new TaskCompletionSource<object>();
StartCore(tcs);
await tcs.Task;
}
static void StartCore(TaskCompletionSource<object> tcs)
{
_cts = new CancellationTokenSource();
_thread = new Thread(Worker);
_thread.Start(tcs);
}
static Thread _thread;
static CancellationTokenSource _cts;
static void Worker(object state)
{
Console.WriteLine("entering worker");
Thread.Sleep(100); //some work
var …Run Code Online (Sandbox Code Playgroud)