C# 任务的角色。异步运行并等待
我有一个简单的异步和等待程序:C# 任务的角色。异步运行并等待,c#,.net,multithreading,asynchronous,C#,.net,Multithreading,Asynchronous,我有一个简单的异步和等待程序: class Program { static void Main() { var demo = new AsyncAwaitDemo(); Task.Run(() => {demo.DoStuff()}; while (true) { Console.WriteLine("Doing Stuff on
class Program
{
static void Main()
{
var demo = new AsyncAwaitDemo();
Task.Run(() => {demo.DoStuff()};
while (true)
{
Console.WriteLine("Doing Stuff on the Main Thread...................");
}
}
}
public class AsyncAwaitDemo
{
public async Task DoStuff()
{
await LongRunningOperation();
}
private static async Task<string> LongRunningOperation()
{
int counter;
for (counter = 0; counter < 50000; counter++)
{
Console.WriteLine(counter);
}
return "Counter = " + counter;
}
}
类程序
{
静态void Main()
{
var demo=new AsyncAwaitDemo();
Task.Run(()=>{demo.DoStuff()};
while(true)
{
Console.WriteLine(“在主线程上做事情”);
}
}
}
公共类异步演示
{
公共异步任务DoStuff()
{
等待长时间运行操作();
}
私有静态异步任务LongRunningOperation()
{
整数计数器;
用于(计数器=0;计数器<50000;计数器++)
{
控制台。写线(计数器);
}
返回“Counter=”+计数器;
}
}
我的第一个问题是:
任务。在任何异步和等待方法中运行
,因为我刚刚删除,程序变得同步。我知道等待用于创建挂起点,并且在该线程的等待函数完成之前不会进一步执行我开始理解C#中的异步编程,阅读并练习了一些示例。除了上面我所要求的澄清之外,我几乎能够了解上下文。
异步
/等待
与任务无关。运行
;但是,它们在某些场景中可以很好地协同工作
Task.Run
在线程池线程上运行一些代码。async
/await
是一种代码转换,允许您以更自然、更强制的方式编写异步代码(有关async
工作原理的更多详细信息,请参阅my)
是否必须使用Task.Run在任何异步和等待方法中运行,因为我刚刚删除了,并且程序变得同步
一点也不!async
/await
在没有任务的情况下非常常用。运行。只要有真正的异步操作,就可以使用async
/await
。一般来说,任何基于I/O的操作都是自然异步操作的好例子。因此,您可以使用之类的操作>HttpClient.GetStringAsync
只使用异步
/等待
而不使用任何任务。运行
但是,请注意,如果使用async
而不使用wait
,则几乎总是错误的。编译器将为LongRunningOperation
发出警告,通知您它实际上不是异步的
以下代码创建时有多少线程?Task.Run(()=>{demo.DoStuff()}
该代码只是将DoStuff
排队到线程池。线程池线程将执行DoStuff
。线程创建取决于许多其他因素。
/wait
与任务无关。请运行;但是,在某些情况下,它们可以很好地协同工作
Task.Run
在线程池线程上运行一些代码。async
/await
是一种代码转换,允许您以更自然、更强制的方式编写异步代码(有关async
工作原理的更多详细信息,请参阅my)
是否必须使用Task.Run在任何异步和等待方法中运行,因为我刚刚删除了,并且程序变得同步
一点也不!async
/await
在没有任务的情况下非常常用。运行。只要有真正的异步操作,就可以使用async
/await
。一般来说,任何基于I/O的操作都是自然异步操作的好例子。因此,您可以使用之类的操作>HttpClient.GetStringAsync
只使用异步
/等待
而不使用任何任务。运行
但是,请注意,如果使用async
而不使用wait
,则几乎总是错误的。编译器将为LongRunningOperation
发出警告,通知您它实际上不是异步的
以下代码创建时有多少线程?Task.Run(()=>{demo.DoStuff()}
该代码只是将DoStuff
排入线程池。线程池线程将执行DoStuff
。线程创建取决于许多其他因素