C# 如何使异步调用在被调用时立即执行?

C# 如何使异步调用在被调用时立即执行?,c#,silverlight,webmethod,C#,Silverlight,Webmethod,我在使用WebMethod分配值时遇到问题。我有一个称为WebMethod的方法: ................ svc.GetNameCompleted += GetUserName; svc.GetNameAsync(ordercode); string name = MyName; ................ 问题是第三行是第一个字符串name=MyName;然后是GetUserName方法 在GetUserName方法中,我给MyName变量赋值,但由于这是在string

我在使用WebMethod分配值时遇到问题。我有一个称为WebMethod的方法:

................
svc.GetNameCompleted += GetUserName;
svc.GetNameAsync(ordercode);

string name = MyName;
................
问题是第三行是第一个字符串name=MyName;然后是GetUserName方法

在GetUserName方法中,我给MyName变量赋值,但由于这是在string name=MyName之后调用的,所以在我第一次执行项目时,我得到了string name=null;由于MyName变量为null。

方法应返回一个值,以便您可以等待其完成:

svc.GetNameCompleted += GetUserName;
Task<string> nameTask = svc.GetNameAsync(ordercode);

...

string name = await nameTask;

据我所知,你不能。Silverlight中的所有web服务调用都是异步的。不能同步调用异步方法。 您应该以异步方式捕获结果,并在方法完成执行后立即告诉Silverlight如何处理它


我认为您应该为您的web方法设置名称,以便管理方法的完成情况并处理结果。

您应该只在获得名称后才设置名称,这将发生在您定义为GetUserName的方法中,但对于GetNameCompleted处理程序来说,这不是一个很好的名称,因此我在下面的示例中对其进行了重命名

public void SomeMethod()
{
  svc.GetNameCompleted += GetUserNameCompleted;
  svc.GetNameAsync(ordercode);
}

public void GetUserNameCompleted(whatever the signature is)
{
  string name = MyName;
}

通过NuGet添加Microsoft.Bcl。