0

funcA関数 ( ) を実行し、別の関数 ( timerFunc) をタイマーとして使用したいと考えています。実行中の関数 ( funcA) が 10 秒間実行された場合、タイマー関数 ( ) を使用して終了したいと考えていtimerFuncます。これは可能ですか?基本的に私がやろうとしていること:

void funcA() {
    // check event 1
    // check event 2
    // check event 3
    // time reaches max here! --exit--
    //check event 4
}

そうでない場合、そのようなシナリオを処理する最善の方法は何ですか? ストップウォッチの使用を検討しましたが、それが最善の方法かどうかはわかりません。これは主に、どのイベントの後にタイムアウトに達するかわからないためです。

4

3 に答える 3

2
Thread t = new Thread(LongProcess);
t.Start();
if (t.Join(10 * 1000) == false)
{
    t.Abort();
}
//You are here in at most 10 seconds


void LongProcess()
{
    try
    {
        Console.WriteLine("Start");
        Thread.Sleep(60 * 1000);
        Console.WriteLine("End");
    }
    catch (ThreadAbortException)
    {
        Console.WriteLine("Aborted");
    }
}
于 2012-06-11T20:13:11.437 に答える
1

リストを作成してから、非常に迅速に作成します。

class Program
{
    static private bool stop = false;
    static void Main(string[] args)
    {
        Timer tim = new Timer(10000);
        tim.Elapsed += new ElapsedEventHandler(tim_Elapsed);
        tim.Start();

        int eventIndex = 0;
        foreach(Event ev in EventList)
        {
           //Check ev
            // see if the bool was set to true
            if (stop)
                break;
        }
    }

    static void tim_Elapsed(object sender, ElapsedEventArgs e)
    {
        stop = true;
    }
}

これは、単純なシナリオで機能するはずです。より複雑な場合は、さらに詳細が必要になる場合があります。

于 2012-06-11T20:04:19.603 に答える
1

すべてのイベントを Action の配列または他のタイプのデリゲートに入れ、リストをループして適切なタイミングで終了することができます。

または、バックグラウンド スレッド、タスク、またはその他のスレッド メカニズムですべてのイベントを実行し、適切な時間になったらスレッドを中止/終了します。ハード アボートは、リークやデッドロックを引き起こす可能性があるため、不適切な選択ですが、適切なタイミングで CancellationToken などを確認できます。

于 2012-06-11T19:46:18.473 に答える