Очередь потока в .net - PullRequest
       9

Очередь потока в .net

2 голосов
/ 10 марта 2010

У меня есть 2 функции, которые должны выполняться одна за другой. В этой функции выполняются асинхронные вызовы. Как мне выполнить вторую функцию после завершения асинхронного вызова?

Например,

public void main()
{
   executeFn("1");
   executeFn("2"); //I want this to be executed after 1 has finished.
}


private bool executeFn(string someval)
{
     runSomeAsyncCode(); //This is some async uploading function that is yet to be defined.
}

Ответы [ 6 ]

3 голосов
/ 10 марта 2010

Вы можете использовать Thread.Join .

Но тогда я не вижу смысла асинхронного выполнения этих двух функций, поскольку они становятся последовательными.

1 голос
/ 10 марта 2010

Пусть runSomeAsyncCode() возвращает IAsyncResult и реализует методы BeginX EndX, аналогичные CLR модели асинхронного программирования . Используйте метод EndX, чтобы дождаться завершения выполнения кода.

0 голосов
/ 10 марта 2010

Один простой способ - использовать пользовательский пул потоков

http://www.codeplex.com/smartthreadpool

Вы можете создать отдельный пул потоков, установить размер пула потоков равным 1 и поставить в очередь рабочих

0 голосов
/ 10 марта 2010

Можно рассмотреть возможность использования общих делегатов для выполнения первого метода async, а затем при обратном вызове выполнить другой метод async. Если вы действительно беспокоитесь, выполняя их синхронизацию по отношению друг к другу.

0 голосов
/ 10 марта 2010

попробуйте это:

public void main() 
{ 
     executeFn("1"); 
     executeFn("2");
} 
List<string> QueuedCalls = new List<string>(); // contains the queued items
bool isRunning = false; // indicates if there is an async operation running
private bool executeFn(string someval) 
{ 
    if(isRunning) { QueuedCalls.Add(someval); return; } // if there is an operation running, queue the call
    else { isRunning = true; } // if there is not an operation running, then update the isRunning property and run the code
    runSomeAsyncCode(); //undefined async operation here<- 
    isRunning = false; //get here when the async is completed, (updates the app telling it this operation is done)
    if(QueuedCalls.Count != 0)//check if there is anything in the queue
    {
        //there is something in the queue, so remove it from the queue and execute it.
        string val = QueuedCalls[0];
        QueuedCalls.RemoveAt(0);
        executeFn(val);
    }
} 

таким образом не заблокирует любые потоки и просто выполнит вызов из очереди, когда появятся первые финны, что, как я полагаю, вы хотите! Удачного кодирования! Теперь id рекомендуют запустить последний раздел, где он устанавливает isRunning в false, внутри вашей асинхронной операции, или запускает ее с событием или чем-то еще, единственная загвоздка в том, что кусок кода должен выполняться, когда ваша асинхронная операция завершена, так что, как бы вы ни хотели, это зависит от вас

0 голосов
/ 10 марта 2010

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

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