异步运行长时间同步操作

时间:2018-07-16 04:57:05

标签: c# asp.net asynchronous .net-4.0

下面,我有一个简单的异步示例,该示例可以正常运行,并具有以下输出:

Starting
Processing Diff
Log Diff Initiated
Diff processed

我需要对此进行调整,以使GetDiff是一个同步操作,该操作由LogDiff异步调用。

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

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

仅供参考,我在.net 4.0上,这就是为什么我的示例中使用“延迟”填充方法的原因。

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;
    }
}

1 个答案:

答案 0 :(得分:1)

您为什么不在单独的Task中执行繁重的LogDiff()方法?

    static void  Main()
    {
        Console.WriteLine("Starting");
        //Save project
        Console.WriteLine("Project saved");
        Task task = new Task(new Action(LogDiff));
        task.Start();
        Console.ReadLine();
    }

    public void LogDiff()
    {
        var results = GetDiff("Processing Diff");
        Console.WriteLine(results);
    }