【解決方法】タスクが作成されていませんか?


こんにちは、みんな、

VB を選択するという選択肢はなかったので、今後も歓迎していただければ幸いです。

テキストファイルから多数の特定のエントリを非同期的に読み取ろうとしています。 基本的に、私は現在、からの基本パターンに従っています このマイクロソフトの例

タスクの作成に何か問題があるようです。デバッグ中、’entriesTasks’ では While ループに入る直前にリストに 53 個のタスクが表示されますが、ループは最初の行 (‘Dim completedTask…’) の後で終了し、3 つのスレッドがコード 0 で終了します。

誰かが潜在的なエラーを簡単に調べて、これについて少しガイドしてもらえますか? 念のため言っておきますが、カスタム オブジェクトとカスタム メソッドは問題ないはずです (事前にテスト済み)。’Task(Of IEnumerable(Of FileData))’ を返すはずのカスタム メソッドは呼び出されさえしていません。つまり、ブレークポイントに到達していません。

ありがとう、
マイケル

私が試したこと:

VB
Dim entriesTasksQuery = From fi In LTODateilisten Select New Task(Of IEnumerable(Of FileData))(Function()
                                    Dim dlf As New DirListFile(fi)
                                    Return dlf.ReadFileEntriesAsync(fi)
                                  End Function)
Dim entriesTasks As List(Of Task(Of IEnumerable(Of FileData))) = entriesTasksQuery.ToList

While entriesTasks.Count > 0
     Dim finishedTask As Task(Of IEnumerable(Of FileData)) = Await Task.WhenAny(entriesTasks)
     entriesTasks.Remove(finishedTask)
     Dim entries As IEnumerable(Of FileData) = Await finishedTask
     Dim msg As String = $"{entries.Count} entries found."
     Debug.WriteLine(msg)
End While

解決策 1

引用:

何かが間違っているようです

これは「車が始動しない」と言っているようなものです。 私たちは「彼は鍵を回しましたか?何が起こったのですか?」という感じです。 具体的にする必要があります。

コードを実行したときにスレッド例外エラーが発生しましたか? 安全でないスレッド操作を行っているため、これが私の最初の推測です。 List スレッドセーフではなく、 entriesTasks.Remove(finishedTask) 犯人になります。 を使用した方がよいでしょう。 ConcurrentBag そして使用します TryTake エントリを削除します。

書き直すと次のようになります。

VB
Dim entriesTasksQuery = From fi In LTODateilisten Select New Task(Of IEnumerable(Of FileData))(Function()
                                    Dim dlf As New DirListFile(fi)
                                    Return dlf.ReadFileEntriesAsync(fi)
                                  End Function)

Dim entriesTasks As New ConcurrentBag(Of Task(Of IEnumerable(Of FileData)))(entriesTasksQuery)

While entriesTasks.Count > 0
    Dim finishedTask As Task(Of IEnumerable(Of FileData)) = Await Task.WhenAny(entriesTasks)
    entriesTasks.TryTake(finishedTask)
    Dim entries As IEnumerable(Of FileData) = Await finishedTask
    Dim msg As String = $"{entries.Count} entries found."
    Debug.WriteLine(msg)
End While

これはテストされていませんが、スレッド例外が修正されます。 しかし、詳しい説明がなければ、私はただ推測するだけです。

コメント

タイトルとURLをコピーしました