首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对.NET 4异步的困惑

对.NET 4异步的困惑
EN

Stack Overflow用户
提问于 2013-02-07 20:54:21
回答 2查看 1.1K关注 0票数 3

我正在使用Microsoft.Bcl.Async nuget包来使用异步/等待(我的目标是.NET 4,而不是4.5)

我不熟悉异步/等待。下面的代码示例描述了我的问题。为什么不调用突出显示的行?

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AsyncTest
{
class Program
{
    static void Main(string[] args)
    {
        Run();

        Console.WriteLine("Got the value");

        Console.ReadKey();
    }

    public static async void Run()
    {
        Console.WriteLine("Testing Async...");

        var val = await AsyncMethod();

        // HIGHLIGHTED LINE. WHY IS THIS LINE NOT CALLED?
        Console.WriteLine("And the value is... {0}", val);
    }

    public static Task<long> AsyncMethod()
    {
        long myVal = 1;

        for (long l = 0; l < 100000; l++)
        {
            myVal++;
            Console.WriteLine("l = {0}", l);
        }

        return new Task<long>(() => myVal);
    }
}
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-07 20:57:04

这行代码:

代码语言:javascript
复制
Console.WriteLine("And the value is... {0}", val);

被转换(由编译器)为延续;只有当被“等待”的任务完成时,它才会被调用(带有值等)。问题是:你创建了一个任务,但是你还没有启动它:所以它永远不会完成。

如果您从底部创建的任务开始,它将最终完成。另外,通常你会把“正在做”的工作放在Task里面,而不是放在它外面:

代码语言:javascript
复制
    public static Task<long> AsyncMethod()
    {
        var task = new Task<long>(() =>
        {
            long myVal = 1;

            for (long l = 0; l < 100000; l++)
            {
                myVal++;
                Console.WriteLine("l = {0}", l);
            }
            return myVal;
        });
        task.Start();
        return task;
    }

还要注意,Got the valueAnd the value is...之前很久就打印出来了--这是因为延续发生在工作线程上;Run方法在第一个await将控制权返回给调用者(Main)。

票数 5
EN

Stack Overflow用户

发布于 2013-08-06 15:14:17

你不应该叫它"AsyncMethod“,因为它没有异步元素。

该方法使用一个任务,该任务将在与当前线程不同的线程中运行。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14751614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档