警告私はasync/awaitの完全な初心者ですので、これを完全に誤解しています!私の非同期コードが非同期で動作しないのはなぜですか?
私はこの仕組みがどのように機能するかを試しています。WPFウィンドウの表示で単純なコードを試しました。私は
public partial class MainWindow {
private Random _r = new Random(DateTime.Now.Millisecond);
public MainWindow() {
InitializeComponent();
}
private async void Bleah_Click(object sender, RoutedEventArgs e) {
LstMessages.Items.Clear();
AddToMsg("Starting...");
DoSyncStuff();
await DoStuffAsync();
DoMoreStuffSync();
AddToMsg("Done");
}
private void DoSyncStuff() {
int delay = _r.Next(500, 1500);
AddToMsg("DoSyncStuff - waiting for " + delay + "ms");
Thread.Sleep(delay);
AddToMsg("DoSyncStuff - finished");
}
private void DoMoreStuffSync() {
int delay = _r.Next(500, 1500);
AddToMsg("DoMoreStuffSync - waiting for " + delay + "ms");
Thread.Sleep(delay);
AddToMsg("DoMoreStuffSync - finished");
}
private async Task DoStuffAsync() {
await Task.Run(() => {
int delay = _r.Next(500, 1500);
AddToMsg("DoStuffAsync - waiting for " + delay + "ms");
Thread.Sleep(delay);
AddToMsg("DoStuffAsync - finished");
});
}
private void AddToMsg(string msg) {
Dispatcher.BeginInvoke(
new Action(() => { LstMessages.Items.Add(DateTime.Now.ToString("HH:mm:ss.fff") + " - " + msg); }));
}
LstMessages
がウィンドウ上のリストボックスで[...]ボタンのクリックイベントハンドラを追加し、次のようにいくつかの同期および非同期メソッドを追加しました。
ボタンをクリックすると、各遅延の長さにかかわらず、3つのメソッドが常に呼び出した順に実行されることがわかります。
私は明らかにこのようなことを誤解していますが、数時間読んでいて、コードのバリエーションをたくさん試してみると、私はそれが期待どおりに動作するようにはなりません。
私がここで間違っていたことを誰でも明確にすることができますか?
非同期はそれだけで、呼び出し元のスレッドをブロックしませんあなたのコードを並列化しません。 – juharr
良いリソースはhttps://msdn.microsoft.com/en-us/magazine/jj991977.aspxです。いくつかの例はあなたのケースに話すべきです – Brian
あなたの非同期メソッドでは 'Thread.Sleep'を使わないでください。あなたが実際にスレッドをブロックしないように、 'Task.Delay'を使います。 – mason