加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

.net – 如何做一个异步ServiceController.WaitForStatus?

发布时间:2020-12-15 04:34:58 所属栏目:Java 来源:网络整理
导读:所以 ServiceController.WaitForStatus是一个阻止通话.如何才能完成任务/异步方式? 解决方法 ServiceController.WaitForStatus的代码是: public void WaitForStatus(ServiceControllerStatus desiredStatus,TimeSpan timeout){ DateTime utcNow = DateTime
所以 ServiceController.WaitForStatus是一个阻止通话.如何才能完成任务/异步方式?

解决方法

ServiceController.WaitForStatus的代码是:

public void WaitForStatus(ServiceControllerStatus desiredStatus,TimeSpan timeout)
{
    DateTime utcNow = DateTime.UtcNow;
    this.Refresh();
    while (this.Status != desiredStatus)
    {
        if (DateTime.UtcNow - utcNow > timeout)
        {
            throw new TimeoutException(Res.GetString("Timeout"));
        }
        Thread.Sleep(250);
        this.Refresh();
    }
}

这可以使用以下内容转换为基于任务的api:

public static class ServiceControllerExtensions
{
    public static async Task WaitForStatusAsync(this ServiceController controller,ServiceControllerStatus desiredStatus,TimeSpan timeout)
    {
        var utcNow = DateTime.UtcNow;
        controller.Refresh();
        while (controller.Status != desiredStatus)
        {
            if (DateTime.UtcNow - utcNow > timeout)
            {
                throw new TimeoutException($"Failed to wait for '{controller.ServiceName}' to change status to '{desiredStatus}'.");
            }
            await Task.Delay(250)
                .ConfigureAwait(false);
            controller.Refresh();
        }
    }
}

或者支持CancellationToken

public static class ServiceControllerExtensions
{
    public static async Task WaitForStatusAsync(this ServiceController controller,TimeSpan timeout,CancellationToken cancellationToken)
    {
        var utcNow = DateTime.UtcNow;
        controller.Refresh();
        while (controller.Status != desiredStatus)
        {
            if (DateTime.UtcNow - utcNow > timeout)
            {
                throw new TimeoutException($"Failed to wait for '{controller.ServiceName}' to change status to '{desiredStatus}'.");
            }
            await Task.Delay(250,cancellationToken)
                .ConfigureAwait(false);
            controller.Refresh();
        }
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读