非同期操作を起動するいくつかのクラスの作成を開始しており、クライアントがコールバックを登録して結果を受け取るようにしたいと考えています。最終的に以下のコードにたどり着きました。TaskFactory
あくまで一例ですので、他にもっと良い方法があれば教えていただきたいです。Action<>, Func<>
クライアントの基本的な例を次に示します。
Client client2 = new Client();
client2.GetClientList(ClientCallBack);
private static void ClientCallBack(List<Client> listado)
{
//Receive the list result and do some stuff in UI
}
Client クラスのGetCLientList
非同期の例を次に示します。
public void GetClientList(Action<List<Client>> Callback)
{
List<Client> listado=null;
Task.Factory.StartNew(() =>
{
listado = new List<Client>{
new Client{ apellidos="Landeras",nombre="Carlos",edad=25},
new Client{ apellidos="Lopez", nombre="Pepe", edad=22},
new Client{ apellidos="Estevez", nombre="Alberto", edad=28}
};
//Thread.Sleep to simulate some load
System.Threading.Thread.Sleep(4000);
}).ContinueWith((prevTask) =>
{
Callback(listado);
}
);
}
それを行うより良い方法はありますか?Task
関数から戻っcontinueWith
てクライアント側に登録できることはわかっていますが、クラス内にラップしたいと考えています。
編集
別の例を投稿しています。sync
/async
のバージョンを作成しようとしていましたwebrequest
。このアプローチは正しいですか?:
public string ExecuteRequest(string url)
{
HttpWebRequest httpwebrequest = (HttpWebRequest) WebRequest.Create(url);
HttpWebResponse httpwebresponse = (HttpWebResponse) httpwebrequest.GetResponse();
using (StreamReader sr = new StreamReader(httpwebresponse.GetResponseStream()))
{
return sr.ReadToEnd();
}
}
public void ExecuteRequestAsync(string uri,Action<string> callbackResult)
{
Task.Factory.StartNew(() => ExecuteRequest(uri), CancellationToken.None)
.ContinueWith((task) => callbackResult(task.Result));
}