最も簡単なオプションは、次のモデルを使用することです。
public async void button1_Click(object sender, EventArgs args)
{
if(condition)
{
button.visible=true;
await Task.Delay(1000);
GotoMeasurementMode(3000);
await Task.Delay(3000);
query(device.Text);
await Task.Delay(7000);
StopMeasurement();
await Task.Delay(4000);
}
}
C# 5.0 にアクセスできない場合は、4.0 でこれを行うことができます。Delay
.NET 4.0 には存在しないため、独自のメソッドから始める必要があります。
public static Task Delay(int milliseconds)
{
var tcs = new TaskCompletionSource<bool>();
var timer = new System.Threading.Timer(o => tcs.SetResult(false));
timer.Change(milliseconds, -1);
return tcs.Task;
}
これを使用して、次のように記述できます。
Delay(1000)
.ContinueWith(t => GotoMeasurementMode(3000), TaskScheduler.FromCurrentSynchronizationContext())
.ContinueWith(t => Delay(3000)).Unwrap()
.ContinueWith(t => query(device.Text), TaskScheduler.FromCurrentSynchronizationContext())
.ContinueWith(t => Delay(7000)).Unwrap()
.ContinueWith(t => StopMeasurement(), TaskScheduler.FromCurrentSynchronizationContext())
.ContinueWith(t => Delay(4000)).Unwrap();
これは、最初のスニペットがコンパイルされるコードと非常によく似ていますが、明らかに最初のスニペットの方がはるかに優れているため、可能であればそれを使用する必要があります。
C# 3.0 に戻ると、 へのアクセスが失われますTask
。これは、タイマーとコールバックの使用に戻ることを意味します。この単純なヘルパー メソッドから始めて、タスクの管理を処理します。
public static void ExecuteIn(int milliseconds, Action action)
{
var timer = new System.Windows.Forms.Timer();
timer.Tick += (s, e) => { action(); timer.Stop(); };
timer.Interval = milliseconds;
timer.Start();
}
次に、これへの呼び出しをネストできます。
ExecuteIn(1000, () =>
{
GotoMeasurementMode(3000);
ExecuteIn(3000, () =>
{
query(device.Text);
ExecuteIn(7000, () => StopMeasurement());
});
});
C# 3.0 でa を再作成することは可能Task
ですが (4.0 の言語機能を利用していません)、それを行う既存のライブラリがありますが、これは多少複雑になります。