使用svcutil.exe时,我注意到了这个开关,/ tcv:Version35。文档说这个:
版本35:如果您使用/ tcv:版本35 正在为客户生成代码 使用.NET Framework 3.5。通过使用这个 值,SvcUtil.exe工具生成 引用功能的代码 .NET Framework 3.5和之前的版本 版本。使用/ tcv时:Version35 使用/ async开关,两者都有 基于事件和 基于回调/委托的异步 生成方法。此外, 支持支持LINQ的DataSet和 DateTimeOffset已启用。
基于事件和基于回调/委托的异步模型之间有什么区别?
编辑:是一种更新/更好的方式吗?当我不使用/ tcv:Version35开关时,我只获得BeginXXX和EndXXX方法。 Silverlight使用XXXAsync,它告诉我应该使用基于事件的(XXXAsync)方法并使用此开关。答案 0 :(得分:2)
让我们像这样定义一个WCF服务:
namespace StackOverflow
{
[ServiceContract]
public interface ITest
{
[OperationContract]
string GetName();
}
public class Test : ITest
{
public string GetName()
{
return "Joel Spolsky";
}
}
}
如果您对此运行svcutil,您将获得以下客户端定义:
public partial class TestClient : System.ServiceModel.ClientBase<ITest>, ITest
{
// Other details elided...
public string GetData(int value)
{
return base.Channel.GetData(value);
}
}
如果使用/ async标志再次运行svcutil,您将获得以下客户端定义:
public partial class TestClient : System.ServiceModel.ClientBase<ITest>, ITest
{
// Other details elided...
public event System.EventHandler<GetDataCompletedEventArgs> GetDataCompleted;
public string GetData(int value)
{
return base.Channel.GetData(value);
}
[EditorBrowsableAttribute(EditorBrowsableState.Advanced)]
public System.IAsyncResult BeginGetData(int value, System.AsyncCallback callback, object asyncState)
{
return base.Channel.BeginGetData(value, callback, asyncState);
}
[EditorBrowsableAttribute(EditorBrowsableState.Advanced)]
public string EndGetData(System.IAsyncResult result)
{
return base.Channel.EndGetData(result);
}
public void GetDataAsync(int value, object userState)
{
if ((this.onBeginGetDataDelegate == null))
{
this.onBeginGetDataDelegate = new BeginOperationDelegate(this.OnBeginGetData);
}
if ((this.onEndGetDataDelegate == null))
{
this.onEndGetDataDelegate = new EndOperationDelegate(this.OnEndGetData);
}
if ((this.onGetDataCompletedDelegate == null))
{
this.onGetDataCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnGetDataCompleted);
}
base.InvokeAsync(this.onBeginGetDataDelegate, new object[] {value}, this.onEndGetDataDelegate, this.onGetDataCompletedDelegate, userState);
}
}
因此/ async标志只是为您提供了一种异步交互服务的方法,而不是默认的仅同步行为。
GetDataAsync()方法异步调用GetData()方法,并在通过GetDataCompleted事件完成时通知您。
BeginGetData()和EndGetData()方法使用委托的异步行为来异步调用GetData()方法。这类似于System.Windows.Forms.Control类上的BeginInvoke()和EndInvoke()方法或System.IO.Stream类上的BeginRead()和EndRead()方法。