簡単に言えば、私は何がUIをブロックしているのか、それを修正する方法を見ることはできません。私はこれを何時間も見つめてきました。最初から アプリケーション起動時にバックグラウンドスレッドで非同期プロシージャを実行する方法
、App.xaml
<Application x:Class="Front_Office.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
<Application.Resources>
......
</Application.Resources>
</Application>
App.xaml.cs
using Front_Office.ViewModels;
using System.Windows;
namespace Front_Office
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
protected async override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
var mainWindow = new MainWindow { DataContext = await MainWindowViewModel.Create() };
mainWindow.Show();
}
}
}
MainWindow.xaml.cs
using System.Windows;
namespace Front_Office
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
}
}
Factoryパターンを使用MainWindowViewMを作成する非同期呼び出しを伴うodel
public static async Task<MainWindowViewModel> Create()
{
var myClass = new MainWindowViewModel();
await myClass.Initialize();
return myClass;
}
private async Task Initialize()
{
PatientList = await GetPatientList();
FilteredPatientList = PatientList;
}
private MainWindowViewModel() : base()
{
}
GetPatientList()
private Task<ObservableCollection<ViewPatient>> GetPatientList()
{
IsLoading = true;
var x = Task.Run(async() =>
{
Thread.Sleep(30000); // SIMULATING A VERY LONG CALL.
return new ObservableCollection<ViewPatient>(await MedicalClient.GetAllPatientsAsync());
});
IsLoading = false;
return x;
}
私は、アプリケーションの起動時にUIをブロックしないようにバックグラウンドスレッドでMedicalClient.GetAllPatientsAsync()
とThread.Sleep()
を実行しようとしています。運がない。
私は間違っていますか?
どのようなヘルプも大歓迎です。
編集#1:
次のように変更することで、私が必要として動作しているようです。これを行う正しい方法ですか? (それはここに記載されているように工場パターンを破るように思われる)。
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
// Droped the async and the await
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
var mainWindow = new MainWindow { DataContext = MainWindowViewModel.Create() };
mainWindow.Show();
}
}
// Dropped async and await. Added Task.Run()
public static MainWindowViewModel Create()
{
var myClass = new MainWindowViewModel(); // Create/Load ViewModel
Task.Run(()=> myClass.Initialize()); // Update ViewModel from Asynchronous methods.
return myClass;
}
完了したときのデータで埋め?そのコードは起動時に実行されますが、UIはブロックされていますか?または、スタートアップ時にタスクが実行されていませんか? –
@FernandoRodriguez Taskは実行中ですが、Task.Run(...)の実行中はUIがブロックされています。 –