2
私は決して完了しないと思われるC#の非同期メソッドを持っています。デリゲートを介して呼び出され、フォームを作成します。デリゲートやフォームの作成を取り除くとうまくいきます。どんな洞察力も大いにありがとう!コードは次のよう:あなたの非同期タスク内フォームを作成しても完了しない非同期メソッドに代理人を使用する
public delegate Task<bool> TaskDel();
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
button1.Tag = (TaskDel)taskAsync;
}
private async void button1_Click(object sender, EventArgs e)
{
// if I don't use a delegate here there is no problem.
await Task.Run(() => ((sender as Button).Tag as TaskDel)());
}
public async Task<bool> taskAsync()
{
await new HttpClient().GetStringAsync(URL);
Form form = new Form(); // if I remove this line method works.
await new HttpClient().GetStringAsync(URL);
return true; // as is, never reaches this line
}
}
コードは、私は問題を明らかにその書くことができる最も簡単でした。コンパイル時に呼び出されるメソッドがわからないので、実際にはデリゲートを使用する必要があります。私は本当になぜフォームの作成とデリゲートの使用が実行をブロックするように見えるのか理解したい。あなたの考えをありがとう。 –
これは、UIスレッドではないスレッドで新しいフォームを呼び出すことが許可されていないためです。これはTask.Runの機能です。 –
ああ、私はTask.Runがそのことを認識しませんでした。私はそれがUIスレッド上で動作するように見えるのと同等であると考えていました。また、デリゲートで待っているとは思われません。どうもありがとう。 –