如何在静态方法中使用Task.Run

时间:2013-05-01 09:09:06

标签: c# asynchronous async-await

我想在静态方法中使用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时它不会回来。

1 个答案:

答案 0 :(得分:3)

我怀疑你是从UI或ASP.NET请求线程调用它。在这种情况下,导致死锁的是Result,因为我解释了on my blogin a recent MSDN article

您应该使用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;
}

另外,请考虑遵循Task-based asynchronous pattern。在这种情况下,您可以将GetSettingByName重命名为GetSettingByNameAsync,并将任何Task.Run用法移至该方法中。