1

我想在静态方法中使用 Task.Run。但是当我在静态方法中调用 task.run 时,它会丢失。

  public static void TestLevel()
   {
       var UserSetting = Task.Run(async () =>
        {
            return await database.GetSettingByName("test");
        }).Result.Value;

        User objuser = new User();
        objuser.usersetting = UserSetting;
   }

当它调用 task.run 时它不会回来。

4

1 回答 1

3

我怀疑您是从 UI 或 ASP.NET 请求线程调用它的。在这种情况下,正如我在我的博客最近的 MSDN 文章中Result所解释的那样,正是导致死锁的原因。

您应该使用await而不是Result

public static async Task TestLevelAsync()
{
    var UserSetting = await Task.Run(async () =>
    {
        return await database.GetSettingByName("test");
    });

    User objuser = new User();
    objuser.usersetting = UserSetting.Value;
}

另外,请考虑遵循基于任务的异步模式。在这种情况下,您将重命名GetSettingByName为该方法GetSettingByNameAsync并将任何Task.Run用法移动到该方法中。

于 2013-05-01T11:14:30.087 回答