gpt4 book ai didi

multithreading - Silverlight - 在从方法返回之前等待异步调用完成

转载 作者:行者123 更新时间:2023-12-03 13:21:54 26 4
gpt4 key购买 nike

我有一个 Silverlight 应用程序,它使用 WCF 服务并使用 Wintellect Power Threading 库来确保在应用程序继续之前完全执行逻辑。这是通过使用委托(delegate)回调应用程序来实现的,因此它可以在服务调用完全完成后继续。

我希望在我的应用程序的另一部分实现同样的事情,但不使用回调,例如call 方法使用 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 用户的调用在 helper 方法中的不同线程上执行,但永远不会返回。也许这是由于 yield 和调用方法正在休眠。我已经检查了让用户在不同线程上的调用,所以我认为一切都应该分开,

最佳答案

您使用的整个构造与 Silverlight 的当前最佳实践不匹配。在 Silverlight 中,您的数据访问方法(当然是通过 Web 服务)是异步执行的。您不应该围绕它进行设计,而是相应地调整您的设计。

但是,顺序调用服务(与同步调用不同)在某些情况下可能是有效的。在 this blog post我已经展示了如何通过订阅远程调用的 Completed 事件并同时阻止 UI 来实现这一点,工作流看起来和感觉就像正常的异步调用。

关于multithreading - Silverlight - 在从方法返回之前等待异步调用完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6413446/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com