2016-12-12 2 views
-6

У меня возникли трудности при вызове метода async из моего текущего метода. Попытка сделать что-то вроде этого:Как вызвать метод async из другого метода

int i; 
public void Method1() { 
    while (statement1) { 
     ~code~ 
     Method2(i); 
    } 
    while (statement2) { 
     ~code~ 
     Method2(i); 
    } 
} 

public async void Method2(int i) { 
    if(statement){ 
     ~code~ 
     await Task.Delay(2000); 
    } 
    else 
    { 
     ~code~ 
     await Task.Delay(2000); 
    } 
} 

Так я хочу в основном Method2 быть способ управления потоком (использует другой метод, который изменяет изображения в PictureBoxes), но я не могу заставить его работать и когда он работает, он никогда ничего не задерживает. Кто-нибудь знает, что я делаю неправильно? Method2 Изменения в заявлении Method1.

+0

a) Должен ли метод Method1 дождаться завершения метода Method2 до его продолжения?б) Можете ли вы также сделать асинхронный метод1? c) Не используйте async void, используйте async Задайте – EJoshuaS

+1

Пожалуйста, опубликуйте [MCVE] - «Method2 изменяет в то время как в то время как утверждения Method1 в конце концов» недостаточно, чтобы увидеть, что происходит. –

+0

'async' не означает« выполнить в фоновом режиме ». Это означает «дайте мне обещание выполнить это позже, чтобы я мог« ждать »(и делать некоторые другие вещи). В зависимости от того, что именно вы пытаетесь достичь, возможны несколько подходов к переписыванию. Зачем начинать с асинхронного метода Method2? –

ответ

0

best practice для асинхронного/ждать, чтобы использовать асинхра «весь путь вниз» (если вы и в самом деле не волнуете, о method1 ждут Method2 завершить).

Можно смешать Task.Wait (или подобные конструкции) с асинхронным кодом, но это bad idea, потому что это может привести к взаимоблокировкам.

Самое лучшее, что здесь будет, как и другие показали, просто сделать method1 асинхронной тоже:

public async Task Method1() { 
while (statement1) { 
    await Method2(i); 
    // ... 
} 

Обратите внимание, что вы должны сделать Method1 вернуть задачу тоже, потому что в противном случае вы не можете ждать его :

public async Task Method2 

Это может быть случай XY Problem хотя бы потому, что нет никаких оснований для образца кода вы предоставляете быть асинхронной в первую очередь (или даже отдельный метод, если на то пошло) - вы можете просто сделать Thread.Sleep вместо этого. Кроме того, оператор «if» бессмыслен, потому что, основываясь на том, что вы показали нам, вы задерживаетесь на 2 секунды в любом случае. Было бы полезно, если бы вы могли показать более существенный образец кода, чтобы мы могли лучше понять, что вы пытаетесь сделать, поэтому мы можем порекомендовать, является ли асинхронным решение даже подходящим решением здесь.

Последний вопрос: одна из целей async/await - разрешить вызывающему потоку выполнять другую работу, пока он ждет результата - например, если вы хотите загрузить файл без «висячего» интерфейса. Я видел множество случаев, когда люди используют async/await таким образом, который, по сути, устраняет цель. Например:

static void Main(string[] args) { 
    // This is a terrible thing to do but it's for illustration purposes 
    Task task = Method1(); 
    task.Wait(); 

    // Some other work 
} 

private static async Task Method1() { 
    await Method2(); 
    // Some other work 
} 

private static async Task Method2() { 
    await Method3(); 
    // Some other work 
} 

private static async Task Method3() { 
    await Task.Delay(1000); 
} 

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

+0

Как я уже сказал, метод2 используется для анимации и переключения между изображениями. Я хочу задержку в любом случае, но «способ» изменения изображений определяется методом if's в методе 2, и здесь слишком много кода, я не хотел, чтобы вы, ребята, были в замешательстве. Не могу понять нисходящие движения. – supItsMe

+0

@supItsMe Я не сделал ни слова, но, вероятно, было бы полезно поставить эту информацию в самом вопросе с целью ясности (потому что непонятно из первоначального вопроса, почему вы в первую очередь выполняете асинхронное использование, всегда лучше включить какое-то описание того, что вы пытаетесь выполнить в самом вопросе). – EJoshuaS

0

Вы должны сделать Method1 также добавить и асинхронные ждать оператор для Method2 вызова:

public async Task Method1() { 
    while (statement1) { 
     ~code~ 
     await Method2(i); 
    } 
    while (statement2) { 
     ~code~ 
     await Method2(i); 
    } 
} 

public async Task Method2(int i) { 
    if(statement){ 
     ~code~ 
     await Task.Delay(2000); 
    } 
    else 
    { 
     ~code~ 
     await Task.Delay(2000); 
    } 
} 

Если вам нужно method1 быть Синхронными по какой-то причине, вы должны вызвать Wait() на задаче вернулись из method2. Однако это считается плохой практикой, потому что вы теряете преимущество пула потоков .NET.

+0

«Невозможно дождаться метода« Пустоты ». – supItsMe

+0

Изменить возвращаемый тип метода2() на задачу: public async Задача Method2 (int i) – CodeFuller

+0

Нужно ли мне что-то возвращать в Method2 для продолжения выполнения Method1? Кроме того, могу ли я изменить глобальные данные в Method2? – supItsMe

0

Для другой способ, чтобы иметь возможность ждать method2 последний должен вернуться иметь тип возвращаемого задачи или задачи (а не ничтожной):

public async Task Method2(int i) { 
if(statement){ 
    ~code~ 
    await Task.Delay(2000); 
} 
else 
{ 
    ~code~ 
    await Task.Delay(2000); 
} 

Method1 должен затем быть помечен как асинхронная и ждут Method2:

public async void Method1() { 
while (statement1) { 
    ~code~ 
    await Method2(i); 
} 
while (statement2) { 
    ~code~ 
    await Method2(i); 
} 
} 
Смежные вопросы