WPFMVVMアプリケーションがあります。ビューモデルには、ビューにバインドされたいくつかのプロパティがあり、これらのプロパティは、データベースから直接、またはビューモデルとデータベースの間にあるwcfサービスを介して取得されたデータによって入力されます。データ接続のモードの選択は、クライアントアプリケーションのApp.configファイルのアプリ設定によって異なります。サービスメソッドを非同期的に呼び出し、それらの戻り値を処理する独自の方法を実装したいと思います。タスクを使用して次の方法で実装した場合、スレッドの問題が発生する可能性があるかどうかを知りたいです。
サービス呼び出しフロー:ViewModel> ServiceAgent>(MyWCFServiceClientまたはMyBusinessClient)> MyBusinessClass>データベースサービス操作を使用するために、IMyWCFService(サービス参照の追加時に生成される)を実装するMyWCFServiceClientクラスがあります。
また、同じIMyWCFServiceインターフェイスから実装するMyBusinessClassClientクラスがあります。したがって、MyWCFServiceとMyBusinessClientの両方が同じメソッドシグネチャを持っています。サービスクライアントの生成中に非同期メソッドを生成しないことを選択しました。生成する場合、IMyWCFServiceによって生成された不要なものをMyBusinessClientにも実装する必要がある可能性があるためです。
IMyWCFServiceで定義されたEmployeeオブジェクトを返すメソッドGetEmployee(int id)があると仮定します。したがって、クラスMyWCFServiceClientとMyBusinessClientの両方に実装があります。
私のViewModelには、次のものがあります。
private void btnGetEmployee_Click()
{
ServiceAgent sa = new ServiceAgent ();
//this call/callback process the service call result
sa.GetEmployee(1673, (IAsyncResult ar) =>
{
Task<Employee> t1 = (Task<Employee>)ar;
Employee = t1.Result;
//do some other operation using the result
//do some UI updation also
});
}
//this property is bound a label in the view
private Employee _employee;
public Employee Employee
{
get
{
return _ employee;
}
set
{
_ employee = value;
OnPropertyChanged(() => Employee);
}
}
ServiceAgentクラスは、次のように実装されます。
public class ServiceAgent
{
private IMyWcfService client;
public ProxyAgent()
{
//The call can go to either MyWCFServiceClient or
//MyBusinessClient depending on this setting
//client = new MyBusinessClient();
//OR
client = new MyWcfServiceClient();
}
public void GetEmployee(int id, AsyncCallback callback)
{
//My implementation to execute the service calls asynchronously using tasks
//I don’t want to use the complex async mechanism generated by wcf service reference ;)
Task<Employee> t = new Task<Employee>(()=>client.GetEmployee(id));
t.Start();
try
{
t.Wait();
}
catch (AggregateException ex)
{
throw ex.Flatten();
}
t.ContinueWith(task=>callback(t));
}
}
これは私のUIをフリーズさせています。それは避けたい。また、これが私が達成したいことのための適切な方法であるかどうか疑問に思います。タスク/スレッドとコールバックの経験が少ないので、将来問題(スレッド/メモリ管理など)が発生するかどうかを知りたいです。