2015-11-04 3 views
2

Я сделал немного кода. Он имитирует задержку. Но метод Wait() может быть асинхронным, поэтому в нем будет установлен async. Но теперь внутри Wait() нужно быть instrunction. Как мне сделать такую ​​функцию. Я что-то вроде Func<int> func = new Func<int>(getWaitingTime); Но я не уверен, и этого недостаточно.Delay Program visual C#

public class speed 
{ 
    public int Id { get; set; } 
    public speed(int id) 
    { 
    this.Id = id; 
    } 

    public async void wait() //here is the problem 
    {       
    int waitingTime = getWaitingTime(); 
    Console.Writeline("string.Format("Done with {0}: {1} ms", this.Id, waitingTime)); 
    } 

    private int getWaitingTime() 
    { 
    int waitingTime = new Random().Next(2000); 
    System.Threading.Thread.Sleep(waitingTime); 
    return waitingTime; 
    } 
} 

for (int counter = 0; counter < 10; counter++) 
{ 
    speed slow = new speed(counter); 
    slow.wait(); 
} 
+1

'async' не делает функцию асинхронной, она позволяет * ждем * уже асинхронных вызовов методов. Почему бы вам не использовать 'Task.Delay()' в любом случае, например 'waitait Task.Delay (1000)'? –

+1

Также избегайте методов async void, если вы не знаете, что они вам нужны. 'async void' предназначен только для обработчиков событий или методов, подобных обработчикам событий. Любой другой метод должен вернуть задачу –

+0

. Я не уверен, и этого недостаточно. Почему вы ** не уверены **? Запустили ли вы свой код, генерирует ли оно исключение? Если да, то? Кажется, он работает? Иногда это работает? ** В каком смысле вы _unsure _? ** –

ответ

1

Если я правильно понял ваш вопрос currectly вы можете использовать что-то вроде:

public async void wait() //here is the problem 
    {       
    int waitingTime = await getWaitingTime(); 
    Console.Writeline("string.Format("Done with {0}: {1} ms", this.Id, waitingTime)); 
    } 

    private Task<int> getWaitingTime() 
    {  
    return new Task<int>.Run(() => 
    { 
     int waitingTime = new Random().Next(2000); 
     System.Threading.Thread.Sleep(waitingTime); 
     return waitingTime; 
    }); 
    } 

или просто использовать Task.Delay(time); как предложил Рон Бейер (таким образом, вы будете нуждаться только один метод вместо двух):

public async void wait() 
    { 
     int waitingTime = new Random().Next(2000); 
     await Task.Delay(waitingTime); 
     Console.WriteLine(waitingTime); 
    } 
+1

Почему бы просто не выполнить 'getWaitingTime' async и' ждать Task.Delay (waitingTime) '? –

+0

Выглядит хорошо. Теперь он работает, и я использовал это: 'Func func = new Func (getWaitingTime);' с then 'int waitingTime = ожидание Task.Factory.StartNew (func);', а затем строка console.Write. –

+0

@RonBeyer Спасибо Рон, я просто подумал, что OP хочет сохранить свой метод getWaitingTime() как есть. – Fabjan