警告私は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つのメソッドが常に呼び出した順序で実行されていることがわかります。
私は明らかにこのようなものがどのように機能するかを誤解していますが、数時間読んで、コードのバリエーションをたくさん試した後、期待どおりに機能させることができません。
私がここで間違ったことを誰かが明確にできますか?
このアプローチを試してください。非同期メソッドを開始したようですが、UIスレッドですぐに待機しています。
private async void Bleah_Click(object sender, RoutedEventArgs e)
{
LstMessages.Items.Clear();
AddToMsg("Starting...");
DoSyncStuff();
Task t = DoStuffAsync();
DoMoreStuffSync();
await t;
AddToMsg("Done");
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加