Какие методы могут использоваться, чтобы заставить поток ожидать события и затем продолжить свое выполнение?

Я думаю, что люди не понимают ключевого слова var. Они путают его с Visual Basic / ключевое слово JavaScript, которое является различным зверем весь toghether.

Многие люди думают, что ключевое слово var подразумевает слабый контроль типов (или динамический контроль типов), в то время как на самом деле c# и остается со строгим контролем типов.

, Если Вы рассматриваете это в JavaScript:

var something = 5;

Вам разрешают:

something = "hello";

В случае c#, компилятор вывел бы тип из первого оператора, заставив что-то быть типа "интервалом", таким образом, второй оператор приведет к исключению.

Люди просто должны понять, что использование ключевого слова var не подразумевает динамический контроль типов и затем решает, как далеко они хотят взять использование ключевого слова var, зная, что это не будет иметь абсолютно никакого различия относительно того, что будет скомпилировано.

Уверенный ключевое слово var было представлено для поддержки анонимных типов, но если Вы смотрите на это:

LedDeviceController controller = new LedDeviceController("172.17.0.1");

Это является очень очень подробным, и я уверен, что это столь же читаемо, если не больше:

var controller = new LedDeviceController("172.17.0.1");

результатом является точно то же, таким образом, да я использую его всюду по своему коду

ОБНОВЛЕНИЕ:

, Возможно, просто возможно... они должны были использовать другое ключевое слово, тогда у нас не было бы этого обсуждения..., возможно, "выведенное" ключевое слово вместо "var"

16
задан Artem Barger 7 August 2009 в 18:20
поделиться

4 ответа

Я часто использую дескриптор ожидания AutoResetEvent , когда мне нужно дождаться завершения асинхронной задачи:

public void PerformAsyncTasks()
{
    SomeClass someObj = new SomeClass()
    AutoResetEvent waitHandle = new AutoResetEvent(false); 
    // create and attach event handler for the "Completed" event
    EventHandler eventHandler = delegate(object sender, EventArgs e) 
    {
        waitHandle.Set();  // signal that the finished event was raised
    } 
    someObj.TaskCompleted += eventHandler;

    // call the async method
    someObj.PerformFirstTaskAsync();    
    // Wait until the event handler is invoked
    waitHandle.WaitOne();
    // the completed event has been raised, go on with the next one
    someObj.PerformSecondTaskAsync();
    waitHandle.WaitOne();
    // ...and so on
}
28
ответ дан 30 November 2019 в 17:05
поделиться

Один из вариантов - использовать EventWaitHandle , чтобы сигнализировать о завершении.

5
ответ дан 30 November 2019 в 17:05
поделиться

Для этого можно использовать ManualResetEvent .

Поток, который должен обработать первым, просто принимает событие resetEvent и ожидает его конца, чтобы установить событие.

Поток, которому необходимо подождать, может удерживать его дескриптор и вызывать resetEvent.WaitOne (). Это заблокирует этот поток до завершения первого.

Это позволяет вам обрабатывать блокировку и упорядочивание событий очень аккуратно.

1
ответ дан 30 November 2019 в 17:05
поделиться

Я добился хороших результатов, используя метод обратного вызова, который рабочий поток вызывает по завершении работы. Это превосходит опрос и упрощает передачу параметров обратно вызывающей стороне.

0
ответ дан 30 November 2019 в 17:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: