【问题标题】:How to get a client without freezing the Windows Forms App C# WindowsPCL如何在不冻结 Windows 窗体应用程序 C# WindowsPCL 的情况下获取客户端
【发布时间】:2020-08-20 18:06:45
【问题描述】:

我正在尝试从我的网站获取发布数据以在 Windows 窗体应用程序中使用。当我尝试调用下面的方法来获取我网站的 WordPressClient 时,整个表单冻结并且没有响应。

public static async Task<WordPressClient> GetClient()
        {
            //JWT authentication
            var client = new WordPressClient("http://website.com");
            client.AuthMethod = AuthMethod.JWT;

            //Form freezes on this line
            await client.RequestJWToken("email", "password");

            return client;
        }

【问题讨论】:

  • 调用GetClient() 的方法是什么样的?也是异步的吗?

标签: c# wordpress asynchronous task wordpress-rest-api


【解决方案1】:

我不确定那里发生的内部逻辑是什么, 但尝试将 WordPressClient 构造函数的调用包装到 Task.Run 中:

public static async Task<WordPressClient> GetClient()
{
    try
    {
        WordPressClient client = null;

        await Task.Run(() =>
        {
            //JWT authentication
            client = new WordPressClient("http://website.com");
            client.AuthMethod = AuthMethod.JWT;
        });

        //Form freezes on this line
        await client.RequestJWToken("email", "password");

        return client;
    }
    catch (Exception e) // this should be more specific Error Handler
    {
        //Console.WriteLine(e.Message);
        throw;
    }
}

另外,请确保运行 GetClient() 的代码使用 async 运行它:

var client = await GetClient();

【讨论】:

  • 这不会编译,更适合作为评论而不是答案。
  • 您在 (await Task.Run()) 中初始化了客户端,因此 (await client.RequestJWToken("email", "password") 无法访问客户端,因为它是一个局部变量。另外我认为问题出在我完全使用 await 运算符时。我与 await 运算符一起使用的任何方法都会冻结应用程序
  • @zaidiqbal,这是我犯的一个愚蠢的错误,抱歉,刚刚修复。关于await 操作符:它绝不会冻结任何东西,因为它所做的是告诉前台线程释放,直到异步操作完成。话虽这么说,我不确定用Task.Run 本身包装初始化是否会有所帮助,但您可以尝试检查构造函数调用是否实际上花费了很多时间。
猜你喜欢
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-11
  • 2012-12-21
  • 1970-01-01
相关资源
最近更新 更多