双工服务冻结客户端的呼叫请求/答复方法,直到发生超时

时间:2018-08-25 07:10:28

标签: wcf duplex

我已经创建了一个双工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(一个或多个时间直到客户端冻结)

一分钟后,我有一个超时异常。

1 个答案:

答案 0 :(得分:0)

如果我从客户端使用async / await,则一切正常。

ex:以这种方式调用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;
    }
}