Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 任务的角色。异步运行并等待_C#_.net_Multithreading_Asynchronous - Fatal编程技术网

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=”+计数器;
}
}
我的第一个问题是:

  • 是否必须使用
    任务。在任何异步等待方法中运行
    ,因为我刚刚删除,程序变得同步。我知道等待用于创建挂起点,并且在该线程的等待函数完成之前不会进一步执行
  • 第二,

  • 下面的代码创建时有多少线程

    Task.Run(()=>{demo.DoStuff()}

    如果它不止一个,则是依赖于内部操作的线程数,在本例中,它是针对带计数器的循环的


  • 我开始理解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
    。线程创建取决于许多其他因素