【发布时间】:2016-01-20 22:32:17
【问题描述】:
我正在阅读documentation for DbConnection.OpenAsync(CancellationToken),发现以下sn-p:
默认实现调用同步的Open 调用并返回一个已完成的任务。如果传递了一个已经取消的cancellationToken,默认实现将返回一个取消的任务。 Open 抛出的异常将通过返回的 Task Exception 属性进行通信。
现在,如果我的网络连接不稳定/缓慢,并且使用的数据库提供程序尚未覆盖 DbConnection.OpenAsync(CancellationToken)(即,我使用的不是 System.Data.SqlClient),并且 如果我将其放入 UI Button 的事件处理程序中,例如:(假设代码,未经测试)
async void button1_Clicked(object sender, EventArgs e)
{
using (var connection = MyProviderFactory.CreateConnection())
{
button1.Text = "Opening…";
connection.ConnectionString = _SomeString;
try
{
await connection.OpenAsync(default);
button1.Text = "Opened successfully!";
}
catch (Exception ex)
{
button1.Text = ex.Message;
}
}
}
根据我引用的文档,如果连接需要足够长的时间才能完成,如果提供者没有覆盖默认实现,则在建立连接时我的表单将是“(未响应)”。无论底层数据库提供商如何,为了防止这种情况发生,我不妨这样做await Task.Run(async () => await connection.OpenAsync());。为什么默认实现是这种方式?如果不编写提供程序感知代码,应该如何知道何时需要Task.Run()?
【问题讨论】:
标签: c# .net task-parallel-library