我有一個使用WCF服務的Silverlight應用程序,並且還使用Wintellect Power Threading庫確保邏輯在應用程序繼續之前完全執行。這是通過使用委託回調應用程序來實現的,因此在服務調用完成後它可以繼續。Silverlight - 在從方法返回之前等待異步調用完成
我希望在我的應用程序的另一部分中實現同樣的功能,但不使用回調。使用WCF服務的調用方法說從數據庫加載一個對象,等待它返回,然後從調用的原始方法返回對象的Id。
我能看到做到這一點的唯一方法是在助手庫中執行對WCF服務的調用,該助手庫將對象加載到不同的線程,並且原始方法將繼續檢查輔助程序庫(使用靜態變量)等待它完成並返回。
這是實現此功能的最佳方式嗎?如果是這樣的話,我的實施細節無法正常工作。
public class MyHelper
{
private static Thread _thread;
private static User _loadedObject;
public static GetUser()
{
return _loadedObject;
}
public static void LoadObject(int userId)
{
_loadedObject = null;
ParameterizedThreadStart ts = new ParameterizedThreadStart(DoWork);
_thread = new Thread(ts);
_thread.Start(userId);
}
private static void DoWork(object parameter)
{
var ae = new AsyncEnumerator();
ae.BeginExecute(DoWorkWorker(ae, Convert.ToInt32(parameter)), ae.EndExecute);
}
private static IEnumerator<Int32> DoWorkWorker(AsyncEnumerator ae, int userId)
{
// Create a service using a helper method
var service = ServiceHelper.GetService<IUserServiceAsync>();
service.BeginGetUserById(userId, ae.End(), null);
yield return 1;
_loadedObject = service.EndGetUserById(ae.DequeueAsyncResult());
_thread.Abort();
}
}
我的方法則是:
public int GetUser(int userId)
{
MyHelper.LoadObject(userId);
User user = MyHelper.GetUser();
while (user == null)
{
Thread.Sleep(1000);
user = MyHelper.GetUser();
}
return user.Id;
}
到獲取用戶在輔助方法不同的線程執行的呼叫,但不會返回。也許這是由於收益率和睡眠呼叫方法。我已經檢查了電話以獲得用戶使用不同的線程,所以我認爲一切應該分開,
我同意並遵守最佳做法。這個問題正在試驗和打破這些做法。這個問題是我想調用一個方法的一部分,爲了計算其結果必須調用一些方法,這些方法都可以異步服務,然後返回一個計算值。在被調用者獲得這個值之後,它可以有選擇地執行另一個相同的方法,等等。考慮到要處理的回調/事件的數量,我正在考慮如何儘可能簡單地編寫此場景。 –