2017-11-01 8 views
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 
    } 
} 

答えて

5
  1. を、私は何のUIのアクションが実行されるべきではないと思います。非同期タスクは通常、データのURLをポーリングする(ここで行ったように)、長さを計算する、データファイルを逆シリアル化するなど、リソースが不足している、長時間実行されるプロセスです。呼び出しフォームのUIコントロール。

  2. 代理人を使用する必要はありません。あなたは直接呼び出すことができます:私は含ま

    private async void button1_Click(Object sender, EventArgs e) 
    { 
        await new HttpClient().GetStringAsync(URL); 
        Form form = new Form(); 
    } 
    
+0

コードは、私は問題を明らかにその書くことができる最も簡単でした。コンパイル時に呼び出されるメソッドがわからないので、実際にはデリゲートを使用する必要があります。私は本当になぜフォームの作成とデリゲートの使用が実行をブロックするように見えるのか理解したい。あなたの考えをありがとう。 –

+2

これは、UIスレッドではないスレッドで新しいフォームを呼び出すことが許可されていないためです。これはTask.Runの機能です。 –

+0

ああ、私はTask.Runがそのことを認識しませんでした。私はそれがUIスレッド上で動作するように見えるのと同等であると考えていました。また、デリゲートで待っているとは思われません。どうもありがとう。 –

関連する問題