c# – ExecuteScalarAsync挂起但ExecuteScalar立即返回
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – ExecuteScalarAsync挂起但ExecuteScalar立即返回,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1569字,纯文字阅读大概需要3分钟。
内容图文
所以我遇到了一个困扰我的小问题,我无法找到一个很好的解释 – 我想我可能错误地使用异步/等待功能,但我真的不知道是什么我做错了.
所以我有一些sql代码查询我的数据库并返回一个值.因此我使用ExecuteScalarAsync将该值输出到c#中.
代码如下:
public void CheckOldTransactionsSync()
{
CheckOldTransactions().Wait();
}
public async Task CheckOldTransactions()
{
DateTimeOffset beforeThis = DateTime.UtcNow.Subtract(TimeSpan.FromHours(6));
using (SqlConnection connection = new SqlConnection(SqlConnectionString))
{
await connection.OpenAsync(cts.Token);
using (SqlCommand command = new SqlCommand(@"SELECT TOP 1 1 AS value FROM SyncLog WHERE [TimeStamp] < @BeforeThis;", connection))
{
command.Parameters.Add("@BeforeThis", System.Data.SqlDbType.DateTimeOffset, 7);
command.Prepare();
command.Parameters["@BeforeThis"].Value = beforeThis;
Int32 oldTransactions = (Int32)await command.ExecuteScalarAsync(cts.Token);
// do stuff with oldTransactions
}
}
}
所以我的代码中的其他地方创建了名为cts的CancellationTokenSource,并使用CancelAfter方法设置为在2分钟后过期.
现在我已经使用调试器逐步完成了这段代码,并且我到达了等待调用ExecuteScalarAsync而没有问题的行.但是我似乎有两个执行该行的问题,它似乎没有返回,2它忽略了我的取消令牌,并且在我的两分钟取消令牌到期后仍然运行一段时间.
现在我在Sql Studio中运行sql查询并且返回非常快 – 此时表只有大约4000行.
我现在通过将该行更改为:
Int32 oldTransactions = (Int32) command.ExecuteScalar();
几乎瞬间回归.
这是我改变的唯一代码行,我改回来只是为了确保发生同样的问题.所以我的问题是,异步调用我做错了什么?
解决方法:
你在打电话等.
这是一个classic ASP.NET deadlock.不要阻止,或使用同步IO.
内容总结
以上是互联网集市为您收集整理的c# – ExecuteScalarAsync挂起但ExecuteScalar立即返回全部内容,希望文章能够帮你解决c# – ExecuteScalarAsync挂起但ExecuteScalar立即返回所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。