2015-06-28 2 views
1

У меня есть два класса (CLASS1 и CLASS2), из CLASS1 я вызываю абстрактный метод, и мне нужно подождать до конца и показать сообщение «End Process ...», как я могу решить это?Подождите, пока абстрактная функция завершится C#

КЛАСС-1:

public abstract partial class CLASS1 : Form 
{ 
    public CLASS1() 
    { 
     Console.WriteLine("Start Process ABSMethod1"); 
     ABSMethod1("var1", "var2"); 
     Console.WriteLine("End Process ABSMethod1"); 

     Console.WriteLine("Start Process ABSMethod2"); 
     ABSMethod2(1, 2); 
     Console.WriteLine("End Process ABSMethod2"); 
    } 

    protected abstract void ABSMethod1(String var1, String var2); 
    protected abstract void ABSMethod2(int var1, int var2); 
} 

КЛАСС-2:

class CLASS2: CLASS1 
{ 
    protected override void ABSMethod1(String var1, String var2) 
    { 
     if (var1 == "test") 
     { 
      Task.Factory.StartNew(() => 
      { 
       Parallel.ForEach<clssmt>(items, item => 
       { 
        /* ... */ 
       }); 
      }); 
     } 
     //if i use Task.Wait() freezes UI. 
    } 

    protected override void ABSMethod2(int var1, int var2) 
    { 
     Task.Factory.StartNew(() => 
     { 
      Parallel.ForEach<clssmt>(items, item => 
      { 
       /* ... */ 
      }); 
     }); 
    } 
} 

Я решить эту проблему с помощью protected virtual async Task и await, но я не уверен, если это лучшее решение. И если я использую это решение, сообщение «End Procces» показывается немного до завершения этой задачи.

+1

Если вы на .Net 4.5 и выше, вы должны сделать ваши абстрактные методы возвращают задачу и ждать их в методе aynsc называя их , Однако вы не можете ждать внутри конструктора. Это хороший блог об использовании async/wait с Task.Run: http://blog.stephencleary.com/2013/11/taskrun-etiquette-examples-dont-use.html. Также старайтесь избегать вызова переопределяемых методов из конструкторов, поскольку это может привести к очень непредсказуемому поведению. Особенно, если вы используете не только свою кодовую базу. – Wouter

ответ

4

Мне нужно подождать до конца и показать сообщение «Закончить процесс ...», как я могу это решить?

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

protected abstract Task FirstMethodAsync(string var1, string var2); 
protected abstract Task SecondMethodAsync(int var1, int var2); 

public async Task InitializeAsync() 
{ 
    Console.WriteLine("Start Process ABSMethod1"); 
    await FirstMethodAsync("var1", "var2"); 
    Console.WriteLine("End Process ABSMethod1"); 

    Console.WriteLine("Start Process ABSMethod2"); 
    await SecondMethodAsync(1, 2); 
    Console.WriteLine("End Process ABSMethod2"); 
} 
+0

Но, в "ABSMethod1" и "ABSMethod2", что возвращение? мне нужно вернуть новую задачу? как? спасибо – Manux22

+0

@ Manux22 Вы возвращаете 'Задачу', созданную' Task.Run'. –

+0

Да, извините, я сон. Но, если мне нужна функция прерывания? Обычно я использую 'return;', но в этом случае мне нужно вернуть задачу, как я могу это решить? – Manux22

Смежные вопросы