WinFormsアプリケーションで作業するドライバを取得しようとしています(WPFに行くことができますが、これはオプションではありません)。興味深い問題。 UIスレッドは、awaitメソッドがドライバで呼び出されたときに永遠にブロックします。ここでは私の問題の非常に単純化されたバージョンですが、これはWindows Formsアプリケーションでのみ発生するようです。WinFormsはUIをブロックせずに非同期メソッドを呼び出す同期メソッドを実行します
private void button_Click(object sender, EventArgs e)
{
MessageBox.Show(this.TestSynchronous().ToString());
}
// I'm trying to avoid having to change the code below
private int TestSynchronous()
{
return this.TestAsync().Result;
}
private async Task<int> TestAsync()
{
await Task.Delay(100);
var rand = new Random();
return rand.Next();
}
「TestSynchronous」メソッドに呼び出しをラップして、UIスレッドを永続的にブロックできないようにする方法はありますか?私はどのような方法でも 'Test'メソッドを変更する必要がないようにしようとしていることを忘れないでください。
await works but calling task.Result hangs/deadlocksのような重複したような投稿がありましたが、私の問題と似ていますが、私の問題は同じ方法で解決できません。なぜなら、彼は私がしていない間に非同期メソッドへの直接アクセスを待っているからです。繰り返しますが、私は 'TestSynchronous'メソッドを私に提示するライブラリを呼び出しています。メソッドをラップすることができる方法があるかどうかを知りたいので、ライブラリのどこかでライブラリをブロックすることになりませんコードを変更するためのアクセス権がありません。
よく知られていて、(https://www.bing.com/search?q=c%23+async+result+deadlock)の問題を検索するのは簡単なので、私はあなたがそれを見逃してしまったかどうかはわかりませんあなたの研究中に。将来の質問については、あなたの研究の結果を投稿に追加してください(問題の調査に費やした日数に関係なく、*実証された*研究の欠如は投稿の下落を引き起こす可能性があります)。 –
上記の私の更新版をお読みください。あなたはそれが本質的に同じ問題が発生している間違っているわけではありませんが、自分自身の特定の制限のために、ポストで概説された解決策は私の問題を解決することができません。 – Thermonuclear