2016-06-17 10 views
1

СправочнойSimple Injector с асинхронной Формой Фабриками

Я создаю приложение Winforms, который имеет «AccountManagementView» форму. Каждый раз, когда форма создается, сразу после длительной задачи. Моя цель состоит в том, что я сначала создаю форму и делаю ее так, чтобы пользователь мог взаимодействовать с формой, выполняя длинную задачу.

Solution (до сих пор)

Моя стратегия до сих пор сделать конструктор приватной формы, и вместо того, чтобы использовать метод асинхронной фабрики, чтобы создать форму. После того, как форма создана, фабричный метод запускает длинную задачу.

public partial class AccountManagementView : Form, IAccountManagementView 
{ 
    private AccountManagementView() 
    { 
     InitializeComponent(); 
    } 

    public static async Task<AccountManagementView> CreateAsync() 
    { 
     AccountManagementView view = new AccountManagementView(); 
     await view.LongTask(); 
     return view; 
    } 

    private async Task LongTask() 
    { 
     await Task.Delay(5000); 
     this.lblTitle.Text = "Account Management - Loaded"; 
    } 
} 

Вопрос

Как зарегистрировать этот завод с IoC контейнера Simple Injector? Я пытался зарегистрировать форму с помощью:

container.RegisterSingleton<AccountManagementView>(AccountManagementView.CreateAsync()); 

С этой попыткой, я получаю следующее сообщение об ошибке: «Не может конвертировать из„System.Threading.Tasks.Task“в«Dispatch.UI.Windows .Views.Account.AccountManagementView»

+0

поскольку вы хотите взаимодействие с пользователем, я думаю, что то, что вы хотите, не делая вещи асинхр, а просто раскручивает длительную работу в фоновом режиме. – Steven

+0

Спасибо @Steven. Я думал, что использование await/async по сути делало это фоновой задачей. Вы говорите об использовании [BackgroundWorker] (https://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx?ppud=4)? В чем отличие от технической перспективы? Является ли то, что я пытаюсь сделать с await/async, невозможно? – Andrew

+0

Но в основном у вас есть метод, который возвращает 'Task ', но вы регистрируете 'T'. Вы должны зарегистрировать 'Task '. – Steven

ответ

2

пытается async Task<AccountManagementView> CreateAsync() изменений AccountManagementView CreateAsync()

+0

Я уверен, что вы не можете использовать «ожидание» в методе, который не помечен как «асинхронный». – Andrew

+0

Задача для AccountManagementView, сохранить async. –