c# – SqlClient.SqlCommand.ExecuteScalarAsync表现得像同步调用
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – SqlClient.SqlCommand.ExecuteScalarAsync表现得像同步调用,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2698字,纯文字阅读大概需要4分钟。
内容图文
![c# – SqlClient.SqlCommand.ExecuteScalarAsync表现得像同步调用](/upload/InfoBanner/zyjiaocheng/907/38d4a8b4666149b29054b34b2c80b4e1.jpg)
我已经将我的应用程序剥离到最小的POC,我仍然得到相同的效果.似乎ExecuteScalarAsync的行为类似于同步调用.我认为当遇到await时,异步方法中的其余代码暂停,消息泵返回并从消息队列中获取另一条消息,允许UI继续.标量调用完成后,异步方法的其余部分将被放回消息队列中,以便完成.
当这个小应用程序运行时,TestConnectionAsync方法会挂起UI,并且在ExecuteScalarAsync调用超时之前不会执行任何其他消息.
我做错了什么,或者这种异步方法是否像同步方法一样?
表单有两个按钮.第一个运行异步方法,第二个尝试使用令牌取消异步方法.我再也没有机会点击第二个按钮.
Form1.cs的
public partial class Form1 : Form
{
private DB _db = new DB();
private string _nl = Environment.NewLine;
public Form1()
{
InitializeComponent();
}
private async void button1_Click(object sender, EventArgs e)
{
textBox1.Text = "Starting" + _nl;
string resultString
= (string) await _db.TestConnectionAsync();
textBox1.AppendText(resultString + _nl);
textBox1.AppendText("Done" + _nl);
}
private void button2_Click(object sender, EventArgs e)
{
textBox1.AppendText("Cancelling..." + _nl);
_db.CancelTest();
textBox1.AppendText("Submitted Cancel Token" + _nl);
}
}
DB.cs
public class DB
{
private SqlCommand _command = null;
private CancellationTokenSource _tokenSource
= new CancellationTokenSource();
private CancellationToken _token;
public async Task<string> TestConnectionAsync()
{
_token = _tokenSource.Token;
string query = "SELECT COUNT(*) FROM tblDintData";
try
{
using (SqlConnection connection
= new SqlConnection(BuildConnectionString()))
{
connection.Open();
_command = new SqlCommand(query, connection);
await _command.ExecuteScalarAsync(_token);
return "Successful Database Connection";
}
}
catch (Exception ex)
{
return "Connection Failed:"
+ Environment.NewLine + ex.Message;
}
}
public void CancelTest()
{
_tokenSource.Cancel();
}
private string BuildConnectionString()
{
string ret = "";
ret = "Server=NotARealServer;"
+ "Database=NoSuchDatabase;"
+ "Trusted_Connection=True;";
return ret;
}
}
编辑***
好吧,我通过反复试验发现了一些东西.如果我也通过调用Connection.OpenAsync使Connection.Open异步,那么UI突然变得响应.这不直观,但这是我更改的行:
从:
connection.Open();
至:
await connection.OpenAsync();
但是,当我取消CancellationTokenSource时,ExecuteScalarAsync仍然没有取消.有任何想法吗???
解决方法:
ExecuteScalarAsync确实是一个异步方法,但是你的UI暂停,因为你没有异步调用方法.您可以在this Microsoft page上看到如何更好地处理异步方法调用.
您还需要异步打开连接,您也发现了.该链接包含开放连接,获取数据和异步取消查询的良好示例.
来自道格的编辑**
是的,哈桑是对的.当问题出在Open上时,我很想让ExecuteScalarAsync工作.作为未来的经验法则,我总是会调用这样的命令:
await connection.OpenAsync(_token);
_command = new SqlCommand(query, connection);
await _command.ExecuteScalarAsync(_token);
这样,如果存在连接问题,异步和取消行为仍然有效.
谢谢哈桑.
内容总结
以上是互联网集市为您收集整理的c# – SqlClient.SqlCommand.ExecuteScalarAsync表现得像同步调用全部内容,希望文章能够帮你解决c# – SqlClient.SqlCommand.ExecuteScalarAsync表现得像同步调用所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。