gpt4 book ai didi

c# - 在异步函数上使用 await 时出现异常

转载 作者:太空宇宙 更新时间:2023-11-03 23:39:01 25 4
gpt4 key购买 nike

我正在尝试使用 LinqToTwitter 从 ASP.NET CMS 将新闻文章发布到 Twitter。我已经创建了一个静态类,它将为我处理它,因为无论如何结果都会被记录下来,不会影响网站的其余部分。但是,当我尝试运行它并发布到 Twitter 时,发生异常:

System.InvalidOperationException: An asynchronous module or handler completed while an asynchronous operation was still pending

全类:

public static class SocialTwitter
{
internal async static void PostTwitter(string message)
{
await Post(message);
}

private async static Task Post(string message)
{
var auth = new SingleUserAuthorizer
{
CredentialStore = new SingleUserInMemoryCredentialStore
{
ConsumerKey = ConfigurationManager.AppSettings["TwitterConsumerKey"],
ConsumerSecret = ConfigurationManager.AppSettings["TwitterConsumerSecret"],
AccessToken = ConfigurationManager.AppSettings["TwitterToken"],
AccessTokenSecret = ConfigurationManager.AppSettings["TwitterTokenSecret"]
}
};
await auth.AuthorizeAsync();
TwitterContext t = new TwitterContext(auth);
//Exception occurs here
Status tweet = await t.TweetAsync(Uri.EscapeDataString(message));

if (tweet != null)
{
Util.Log.Info(string.Format("Status posted: ({0}) {1}, {2}", tweet.StatusID, tweet.User.Name, tweet.Text));
}
else
{
Util.Log.Info("Error occurred posting status to Twitter");
}
}
}

奇怪的部分(至少对我而言)是我使用 LinqToTwitter 的工具提示和文档中描述的函数。我知道 一些 函数已完成,而另一个函数仍在运行,但这不是“await”关键字的用途吗?

我尝试删除 PostTwitter 函数或失败点之后的代码,但结果仍然相同。我已经搜索了很多解决方案,但我可能在搜索或搜索错误方向时很糟糕。我什至在 SO 上注册只是为了问这个问题! :D

最佳答案

这里的罪魁祸首是您使用 async void 方法调用 Post:

internal static async void PostTwitter

Async void 函数仅用于事件处理,并且在该上下文之外使用时具有非常奇怪且不可预测的错误处理。看这个MSDN信息文章。

将您的 async void 方法切换为 async Task 方法,一些实际错误可能会开始浮出水面:

internal static async Task PostTwitter

Stephen Cleary 实际上在另一个 SO 中非常详细地探讨了这个问题邮政。直接引用他关于异步方法行为的内容:

Historically, ASP.NET has supported clean asynchronous operations since .NET 2.0 via the Event-based Asynchronous Pattern (EAP), in which asynchronous components notify the SynchronizationContext of their starting and completing

每当您的代码调用 SocialTwitter.PostTwitter 时,PostTwitter 方法都会通知 SynchronizationContext 它已启动,完全绕过您正在使用的任何框架并直接进入 ASP.NET 核心。 PostTwitter 方法然后启动异步 Post 方法,该方法还会通知 SynchronizationContext 它已启动。

ASP.NET 框架了解如何等待任务,但在非常特殊的情况下,除了 WinForms 和 WebForms 之外,它们对如何处理异步无效方法知之甚少。因此,框架认为 async void 已完成,并尝试通知 SychronizationContext async void 方法已完成,即使 async void 方法生成了仍在运行的 async Task 方法。作为专门为捕获此类错误而设计的一系列安全网的一部分,SynchronizationContext 会抛出您已经看到的 InvalidOperationException。

关于c# - 在异步函数上使用 await 时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29771119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com