当异步进程启动时,我的 wpf 应用停止 运行

My wpf app stops running when async processes start

因此,我的应用程序使用同步方法工作,但在我使用异步方法时它停止了。

这是我 class 创建对象时的代码。

_isAdult = (DateСalculation.CalculateAgeAsync(DateOfBirth).Result >= 18);
_sunSign = DateСalculation.CalculateSunSignAsync(DateOfBirth).Result;
_chineseSign = DateСalculation.CalculateSunSignAsync(DateOfBirth).Result;
_isBirthday = DateСalculation.IsBirthdayAsync(DateOfBirth).Result;

这是异步方法。

public static class DateCalculation
{
    public static string CalculateSunSign(DateTime date){...}
    public static async Task<string> CalculateSunSignAsync(DateTime date)
    {
        return await Task.Run(() => CalculateSunSign(date));
    }

    public static string CalculateChineseSign(DateTime date) {...}
    public static async Task<string> CalculateChineseSignAsync(DateTime date)
    {
        return await Task.Run(() => CalculateChineseSign(date));
    }

    public static int CalculateAge(DateTime date) {...}
    public static async Task<int> CalculateAgeAsync(DateTime date)
    {
        return await Task.Run(() => CalculateAge(date));
    }

    public static bool IsBirthday(DateTime date) {...}
    public static async Task<bool> IsBirthdayAsync(DateTime date)
    {
        return await Task.Run(() => IsBirthday(date));
    }
}

每当使用 asyncawait 时,您不应该使用 .Result(除非您必须这样做),因为它会阻止调用线程直到异步操作完成;相当于调用Wait方法

所以按照下面的方式修改代码:

_isAdult = (await (DateСalculation.CalculateAgeAsync(DateOfBirth)) >= 18);
_sunSign = await DateСalculation.CalculateSunSignAsync(DateOfBirth);
_chineseSign = await DateСalculation.CalculateSunSignAsync(DateOfBirth);
_isBirthday = await DateСalculation.IsBirthdayAsync(DateOfBirth);

查看 Asynchronous programming with async and await 文档可以帮助您。