C # Timer 2 Действия одновременно - PullRequest
1 голос
/ 12 августа 2011

Может ли кто-нибудь помочь преобразовать / предоставить скелет того, как преобразовать приведенный ниже код, чтобы обе функции выполнялись одновременно, обе с отдельными таймерами.

public void Controller()
{
    List<int> totRand = new List<int>();
    do
    {
       Thread.Sleep(new TimeSpan(0,0,0,1));
       totRand.Add(ActionA());
    } while (true);

    do
    {
        Thread.Sleep(new TimeSpan(0,0,0,30));
        ActionB(totRand);
        totRand = new List<int>();
    } while (true);
}

public int ActionA()
{
    Random r = new Random();
    return r.Next();
}

public void ActionB(List<int> totRand)
{
    int total = 0;

    //total = add up all int's in totRand

    Console.WriteLine(total / totRand.Count());
}

Очевидно, что вышеупомянутое никогда не сработает, но главное - один метод запускается каждую 1 секунду, добавляет некоторые данные в список.

Другое действие также выполняется с таймером, берет все, что может быть в этом списке, и что-то с ним делает, а затем очищает список. (не беспокоясь о том, что содержимое списка меняется, пока я это делаю). Я много читал учебников и примеров, но просто не могу понять, как мне поступить. Есть идеи / советы?

1 Ответ

3 голосов
/ 12 августа 2011

Для одновременного запуска двух действий на интервале вы можете использовать System.Threading.Timer

private readonly Timer _timerA;
private readonly Timer _timerB;

// this is used to protect fields that you will access from your ActionA and ActionB    
private readonly Object _sharedStateGuard = new Object();

private readonly List<int> _totRand = new List<int>();

public void Controller() {
    _timerA = new Timer(ActionA, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
    _timerB = new Timer(ActionB, null, TimeSpan.Zero, TimeSpan.FromSeconds(1));
}

private void ActionA(object param) {
    // IMPORTANT: wrap every call that uses shared state in this lock
    lock(_sharedStateGuard) {
        // do something with 'totRand' list here           
    }
}

private void ActionB(object param) {
    // IMPORTANT: wrap every call that uses shared state in this lock
    lock(_sharedStateGuard) {
        // do something with 'totRand' list here           
    }
}

Общее состояние, в контексте вашего вопроса, будет списком, который вы хотитеманипулировать обоими действиями: totRand.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...