所以我写了一个快速的async
方法将一些数据放入DataTable
来自 Oracle 数据库。我该怎么称呼这个MainWindow()
不阻塞UI线程?这async
/wait
模型在那里并没有多大意义。
async Task<DataTable> AccessOracleAsync()
{
DataTable dt;
using(OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings["connStr"].ConnectionString))
using (OracleCommand cmd = new OracleCommand(@"SELECT * FROM myTbl", conn))
{
await conn.OpenAsync();
using (var reader = await cmd.ExecuteReaderAsync())
{
dt = new DataTable();
dt.Load(reader);
}
}
return dt;
}
如果没有看到你的构造函数,就很难说那里什么是“有意义的”。但你在这里至少有几个选择。
选项1:将调用放入构造函数中。
在这种情况下,你不能使该方法async
,并且您肯定不希望继续执行构造函数返回之前需要完成的任何操作。但您仍然可以有效地完成 C# 可以为您做的事情async
method:
public MainWindow()
{
InitializeComponent();
AccessOracleAsync().ContinueWith(task => { /* do some other stuff */ },
TaskScheduler.FromCurrentSynchronizationContext());
}
这将在 UI 线程上执行延续,就像您编写的一样await AccessOracleAsync(); /* do some other stuff */
。根据需要在延续方法中添加异常处理(即检查task
反对并适当处理)。
选项#2:将呼叫放在其他地方。
建议使用Loaded
事件,你可以做。这可能看起来像这样:
private async void Window_Loaded(object sender, RoutedEventArgs e)
{
await AccessOracleAsync();
// do some other stuff
}
请注意,如果后者看起来合适,恕我直言,它是更好的选择。它让 C# 编译器为您完成繁重的工作,包括处理异常(您可以将调用包装在try
/catch
一切都“正常”)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)