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