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