首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WCF 技術深度剖析(十一·下):服務端異步操作實現詳解

     編輯:關於.NET

前言:從客戶端異步轉向服務端實現

上篇詳細介紹了客戶端如何發起異步調用,本篇聚焦於服務端如何以異步模式實現服務操作。這對於 I/O 密集型操作(如檔案讀取、資料庫查詢、外部 API 呼叫)至關重要,能釋放執行緒、提升服務擴展性。

一、異步操作的定義與實現原理

1. 程式設計模型:Begin/End 配對模式

在服務契約介面上,透過 [OperationContract(AsyncPattern = true)] 標記,並提供成對的 BeginXxx/EndXxx 方法:

[OperationContract(AsyncPattern = true)]
IAsyncResult BeginDoWork(參數, AsyncCallback callback, object state);
ReturnType EndDoWork(IAsyncResult asyncResult);

範例:同步 Add 與異步 BeginAdd/EndAdd 的對照。

2. WCF 內部調度機制

  • OperationDescription:描述操作元數據,包含 SyncMethod、BeginMethod、EndMethod 三個 MethodInfo。
  • IOperationInvoker:定義同步(Invoke)與異步(InvokeBegin/InvokeEnd)執行介面。
  • 兩種實作:SyncOperationInvoker(同步)、AsyncOperationInvoker(異步)。
  • 運行時根據 AsyncPattern 選擇 Invoker,透過反射呼叫對應方法。

二、實戰:建立異步檔案讀取服務

1. 定義服務契約

[ServiceContract(Namespace = "https://www.artech.com/")]
public interface IFileReader
{
    [OperationContract(AsyncPattern = true)]
    IAsyncResult BeginRead(string fileName, AsyncCallback callback, object state);
    string EndRead(IAsyncResult asyncResult);
}

2. 服務實現:包裝 FileStream 異步 API

public class FileReaderService : IFileReader
{
    private const string BasePath = @"E:\";
    private FileStream _stream;
    private byte[] _buffer;

    public IAsyncResult BeginRead(string fileName, AsyncCallback callback, object state)
    {
        _stream = new FileStream(BasePath + fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
        _buffer = new byte[_stream.Length];
        return _stream.BeginRead(_buffer, 0, _buffer.Length, callback, state);
    }

    public string EndRead(IAsyncResult ar)
    {
        _stream.EndRead(ar);
        _stream.Close();
        return Encoding.ASCII.GetString(_buffer);
    }
}

3. 客戶端體驗:完全透明

無論服務端採用同步或異步實現,客戶端生成的代理類僅暴露同步方法 Read。客戶端可自由選擇同步/異步調用方式,零感知服務端實現細節。

// 客戶端生成的介面
[ServiceContract]
public interface IFileReader
{
    [OperationContract(Action="...", ReplyAction="...")]
    string Read(string fileName); // 唯一的同步方法
}

// 調用簡單直接
using (var proxy = new FileReaderClient())
{
    Console.WriteLine(proxy.Read("test.txt"));
}

關鍵總結

  • 服務端異步實現不改變服務契約的 WSDL/元數據,客戶端無感知。
  • 適用於 I/O 密集型操作,避免阻塞 WCF 執行緒池執行緒。
  • 核心在於正確實作 BeginXxx/EndXxx 配對,並妥善管理非受控資源(如 FileStream)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved