У меня есть приложение Silverlight, которое использует службы WCF, а также использует библиотеку Wintellect Power Threading, чтобы обеспечить полное выполнение логики до продолжения приложения.Это достигается путем обратного вызова приложения с использованием делегатов, чтобы оно могло продолжаться после полного завершения вызова службы.
Я хочу добиться того же в другой части моего приложения, но без использования обратных вызовов, например, вызоваметод, который использует службу 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;
}
Вызов get для пользователя выполняется в другом потокев вспомогательном методе, но никогда не возвращается.Возможно, это связано с выходом и вызывающим методом сна.Я проверил звонок, чтобы пользователь находился в другом потоке, поэтому я думаю, что все должно храниться отдельно,