簡體   English   中英

雙工服務凍結客戶端的呼叫請求/答復方法,直到發生超時

[英]Call request/reply method of duplex service freeze client until timeout occur

我已經創建了一個雙工WCF服務,可以將數據從外部設備返回到客戶端,並且還允許請求/答復呼叫。

我的問題是請求/答復調用有時會凍結客戶端,直到發生超時。

這些是接口:

[ServiceContract(CallbackContract = typeof(ITimerServiceCallback), SessionMode = SessionMode.Required)]
public interface ITimerService
{
    [OperationContract]
    void StartTimer();

    [OperationContract]
    void StopTimer();

    [OperationContract]
    void DoOp();
}

public interface ITimerServiceCallback
{
    [OperationContract(IsOneWay = true)]
    void ReportTick(string now);
}

這是實現:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    public class TimerService : ITimerService
    {
        public TimerService()
        {
            _timer = new System.Timers.Timer() { Interval = 500 };
            _timer.Elapsed += Timer_Elapsed;
        }

        private void Timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            _context.GetCallbackChannel<ITimerServiceCallback>().ReportTick(DateTime.Now.ToString());
        }

        private readonly System.Timers.Timer _timer;
        private OperationContext _context;

        public void StartTimer()
        {
            _context = OperationContext.Current;
            _timer.Start();
        }

        public void StopTimer()
        {
            _timer.Stop();
        }

        public void DoOp()
        {
            System.Threading.Thread.Sleep(200);
        }
    }

重現此問題的步驟:*調用StartTimer *調用DoOp(一個或多個時間直到客戶端凍結)

一分鍾后,我有一個超時異常。

如果我從客戶端使用異步/等待,一切正常。

例如:DoOp方法以這種方式調用:

private async void _btnDoOp_Click(object sender, EventArgs e)
{
    _btnNoOp.Enabled = false;
    try {
        Task task = Task.Run(() => _client.DoOperation());
        await task;
    } catch (Exception ex) {
        MessageBox.Show(ex.Message);
    } finally {
        _btnNoOp.Enabled = true;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM