另一个不等待的等待

tec*_*030 0 c# task async-await uwp

通常我不会发帖,而是阅读并找到答案。

\n\n

但这一次,尽管我发现了十几篇关于异步/等待问题的帖子,但似乎没有解决方案适合我的情况(或者我至少不明白)。

\n\n

我的代码真的很长,所以我不会把它完整地放在这里,但它看起来像这样:\n我有一个正在数据库中写入的任务:

\n\n
public 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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后另一个计算数据库中特定表中的记录数:

\n\n
public 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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

两者都在这里被调用:

\n\n
private 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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

问题是:在我开始计算数据库中有多少行之前,我应该等待该任务完成。\n但我无法成功。\n因此,如果有人可以告诉我我做错了什么,我\会欣赏的。

\n

SO *_*ood 5

这段代码有一些问题:

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.