tec*_*030 0 c# task async-await uwp
通常我不会发帖,而是阅读并找到答案。
\n\n但这一次,尽管我发现了十几篇关于异步/等待问题的帖子,但似乎没有解决方案适合我的情况(或者我至少不明白)。
\n\n我的代码真的很长,所以我不会把它完整地放在这里,但它看起来像这样:\n我有一个正在数据库中写入的任务:
\n\npublic async Task WatchSpool(Button buttonSend)\n{\n LoadOptions();\n //SpoolWatcher spoolWatcher = new SpoolWatcher(this, buttonSend);\n SpoolWatcher spoolWatcher = new SpoolWatcher(this);\n spoolWatcher.OnSpoolWatcherException += OnSpoolWatcherException;\n Task thread = new Task(spoolWatcher.Run);\n spoolWatcherMustStop = false;\n thread.Start();\n //spoolWatcher.Run();\n}\nRun Code Online (Sandbox Code Playgroud)\n\n然后另一个计算数据库中特定表中的记录数:
\n\npublic int CountWaitingRecords(string table)\n{\n int WaitingRecords = 0;\n try\n {\n using (SqliteConnection connexion = new SqliteConnection("Filename = spool.db"))\n {\n connexion.Open();\n using (SqliteCommand cmd = new SqliteCommand("SELECT COUNT(*) AS Count FROM " + table, connexion))\n {\n SqliteDataReader rs = cmd.ExecuteReader();\n rs.Read();\n\n WaitingRecords = rs.GetInt32(rs.GetOrdinal("Count"));\n\n rs.Dispose();\n cmd.Dispose();\n connexion.Dispose();\n }\n }\n }\n catch(Exception ex)\n {\n return -1;\n }\n return WaitingRecords;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n两者都在这里被调用:
\n\nprivate async void buttonSendSelectedItems_Click(object sender, RoutedEventArgs e)\n{\n try\n {\n //things doing fine here\xe2\x80\xa6\n\n //Start spoolWatcher\n batigest = new Batigest(localFolder + "\\\\spool.db");\n batigest.OnSpoolWatcherException += new OnSpoolWatcherExceptionHandler(batigest_OnSpoolWatcherException);\n //Alternative code\n //Task.Run(() => batigest.WatchSpool(Envoyer)).Wait();\n //Actual code\n Task task = batigest.WatchSpool(Envoyer);\n await task;\n //Another alternative code\n //task.Wait();\n\n //Here I count how many rows I\'ve in my table\n LocalDB localDB = new LocalDB(localFolder.Path.ToString() + "\\\\spool.db");\n int count = localDB.CountWaitingRecords("MouvementStock");\n if (count > 0)\n {\n Envoyer.Content = "Envoyer (" + count + ")";\n Envoyer.IsEnabled = true;\n }\n else\n {\n Envoyer.Content = "Envoy\xc3\xa9!";\n }\n\n //Other things doing fine here\xe2\x80\xa6\n\n }\n catch (Exception ex)\n {\n Envoyer.IsEnabled = true;\n Envoyer.Content = "Erreur!";\n InterpretException("InventoryView2.buttonSendSelectedItems_Click()", ex);\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n问题是:在我开始计算数据库中有多少行之前,我应该等待该任务完成。\n但我无法成功。\n因此,如果有人可以告诉我我做错了什么,我\会欣赏的。
\n这段代码有一些问题:
public async Task WatchSpool(Button buttonSend)
{
SpoolWatcher spoolWatcher = new SpoolWatcher(this);
spoolWatcher.OnSpoolWatcherException += OnSpoolWatcherException;
Task thread = new Task(spoolWatcher.Run);
thread.Start();
}
Run Code Online (Sandbox Code Playgroud)
首先,aTask不是线程,因此这样命名它是具有误导性和错误的。
其次,Task必须避免构造函数。假设SpoolWatcher.Run不是 a Task,您应该使用Task.Run:
Task runner = Task.Run(() => spoolWatcher.Run());
Run Code Online (Sandbox Code Playgroud)
第三,也是最重要的一点,您不会await让它完成,因此WatchSpool几乎会立即返回。
public async Task WatchSpool(Button buttonSend)
{
SpoolWatcher spoolWatcher = new SpoolWatcher(this);
spoolWatcher.OnSpoolWatcherException += OnSpoolWatcherException;
await Task.Run(() => spoolWatcher.Run());
}
Run Code Online (Sandbox Code Playgroud)
一般而言,Task返回方法应以 Async 为后缀,因此应该是WatchSpoolAsync.
| 归档时间: |
|
| 查看次数: |
233 次 |
| 最近记录: |