异步运行长时间同步操作

下面我有一个简单的异步示例,它按我的预期工作,输出如下:


Starting

Processing Diff

Log Diff Initiated

Diff processed

我需要对此进行调整,以便 GetDiff 是由 LogDiff 异步调用的同步操作。


我的基本场景如下:当用户单击按钮保存项目时,我必须在项目的新版本和旧版本之间生成差异,这是一项昂贵的操作。我不希望用户必须等待这个差异完成,因为他们真正感兴趣的是他们的项目被保存,所以我希望这个同步操作在后台异步执行,这样用户就没有等待它,甚至知道它。


这意味着我什至不需要回调,我只想在后台触发生成此差异的代码。考虑到所有这些,我应该如何调整我的例子来实现这一点?


也仅供参考,我在 .net 4.0 上,这就是为什么我在我的示例中使用 Delay polyfill 方法的原因。


class Program

{


    static void  Main()

    {

        Console.WriteLine("Starting");

        LogDiff();

        Console.WriteLine("Log Diff Initiated");

        Console.ReadLine();

    }


    public static async Task LogDiff()

    {

        var results = await GetDiff("Processing Diff");

        Console.WriteLine(results);

    }


    public static async Task<string> GetDiff(string str)

    {

        Console.WriteLine(str);

        await Delay(2000);

        return "Diff processed";

    }


    public static Task Delay(double milliseconds)

    {

        var tcs = new TaskCompletionSource<bool>();

        System.Timers.Timer timer = new System.Timers.Timer();

        timer.Elapsed += (obj, args) =>

        {

            tcs.TrySetResult(true);

        };

        timer.Interval = milliseconds;

        timer.AutoReset = false;

        timer.Start();

        return tcs.Task;

    }

}


Smart猫小萌
浏览 169回答 1
1回答

慕斯709654

你为什么不在LogDiff()分离任务中执行你的重方法?&nbsp; &nbsp; static void&nbsp; Main()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("Starting");&nbsp; &nbsp; &nbsp; &nbsp; //Save project&nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("Project saved");&nbsp; &nbsp; &nbsp; &nbsp; Task task = new Task(new Action(LogDiff));&nbsp; &nbsp; &nbsp; &nbsp; task.Start();&nbsp; &nbsp; &nbsp; &nbsp; Console.ReadLine();&nbsp; &nbsp; }&nbsp; &nbsp; public void LogDiff()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; var results = GetDiff("Processing Diff");&nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(results);&nbsp; &nbsp; }
打开App,查看更多内容
随时随地看视频慕课网APP