基于事件和基于回调/委托的异步方法之间的区别?

时间:2009-01-30 14:45:49

标签: wcf

使用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)方法并使用此开关。

1 个答案:

答案 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()方法。