0


0

非同期メソッドを呼び出したいのですが、タイマーを使用したくありません。 どうやってタイマーを代用できますか? タイマーに代わる呼び出し元が必要です。

4 Answer


5


あなたは.NET Asynchronous Programming Modelを調べるべきです。 それははるかに簡単ですし、それが聞こえます。 非同期に実行したいメソッドへのデリゲートを作成するだけです。 次にデリゲートでBeginInvokeを呼び出すと、メソッドは自動的にバックグラウンドスレッドで実行されます。

非同期メソッドで、UIを更新する必要がある場合は、関連するフォームまたはコントロールでControl.Invoke / BeginInvokeを使用する必要があります。

また、非同期メソッドがUIスレッドに何らかの結果を返す必要がある場合は、IAsyncResult(BeginInvokeから返される)とEndInvokeメソッドを利用する必要があります。

詳細については、記事 同期メソッドの非同期呼び出しを参照してください。

一方、Windows.Formsのjavascriptメソッドwindow.settimeout()と同等のものを探しているのであれば、再利用可能なメソッドで標準のTimerをラップすることでスレッドを完全に回避します。

public void SetTimeout(EventHandler doWork、int delayMS){

System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();

timer.Interval = delayMS;

timer.Tick = delegate(object s、EventArgs args){timer.Stop(); ;

timer.Tick = doWork;

timer.Start();

}

それを呼び出すために:

SetTimeout(デリゲート{YourMethod();}、100);

Timerをフォームにドラッグするのと同じように、YourMethod()はフォームメッセージループによってUIスレッド上で実行されます。 したがって、BeginInvoke / Invokeを心配する必要はまったくありません。


1


非同期メソッドを呼び出すためのタイマーは必要ありません。 他にも多くのメカニズムがあります。 タイマーは、特定の時間に、またはある特定の間隔で繰り返し呼び出されるために使用されます。 どちらを非同期に呼び出すのか、特定の時間に何かを呼び出すのかが、あなたの要件です。


0


アプリにGUIがある場合、 `+ Control.BeginInvoke()+`は友達です。 あなたの関数にデリゲートを渡すと、.NETは現在のイベントハンドラが実行を終了した後に呼び出します。

NB:Delegate.BeginInvoke()とは対照的に、Control.BeginInvoke()はメインスレッド(実際にはコントロールが作成されたスレッド)で実行されます。

ほとんどの場合、私は個人的にはワーカースレッドでの非同期実行よりも同じスレッドでの遅延実行を好みます。 あなたのマイレージは異なる場合があります。

void f(string s)
{
  Debug.WriteLine(s + " -> Thread = " +
    System.Threading.Thread.CurrentThread.Name);
}

private void button_Click(object sender, EventArgs e)
{
  Debug.WriteLine("Start button_Click");
  f("straight call in button_Click");
  BeginInvoke(new Action(f), "async call through BeginInvoke()");
  Debug.WriteLine("End button_Click");
}

出力:

Start button_Click
straight call in button_Click -> Thread = Main Thread
End button_Click
async call through BeginInvoke() -> Thread = Main Thread

注: "Main Thread"という名前は、プログラムのMain()内のスレッドに割り当てられています。


0


他の答えで十分ですが、それは以下の記事を見て価値があるかもしれません。 指定された間隔で実行され、指定されたユーザーアクションを実行するためにバックグラウンドスレッドを使用する汎用ポーリングコンポーネントをc#で示しています。

使用例

IPoller poller = new UrlPoller(args [0]、TimeSpan.FromSeconds(7)); IPolling pollingComponent = new Polling.Core.Polling(poller); pollingComponent.SubscribeForPollingUpdates(PollingAction); pollingComponent.Start();

コードと完全なサンプルについては、以下を参照してください。