所以我编写了一个快速的async
方法来将一些数据从 Oracle 数据库中获取到 DataTable
中。我应该如何在不阻塞 UI 线程的情况下从 MainWindow()
调用它? 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
方法中为您完成的工作:
public MainWindow()
{
InitializeComponent();
AccessOracleAsync().ContinueWith(task => { /* do some other stuff */ },
TaskScheduler.FromCurrentSynchronizationContext());
}
这将在 UI 线程上执行延续,就像您编写了 await AccessOracleAsync();/* 做一些其他的事情 */
。根据需要在延续方法中添加异常处理(即检查 task
对象并适当处理)。
选项#2:将调用放在其他地方。
有人建议使用 Loaded
事件,您可以这样做。这可能看起来像这样:
private async void Window_Loaded(object sender, RoutedEventArgs e)
{
await AccessOracleAsync();
// do some other stuff
}
请注意,如果后者看起来合适,恕我直言,它更可取。它让 C# 编译器为您完成繁重的工作,包括处理异常(您可以将调用包装在 try
/catch
中,一切都“正常工作”)。
关于c# - 如何从 MainWindow 调用异步方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29014906/