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

c# – 如何在线程正在工作时停止服务(不使用Thread.Abort)

发布时间:2020-12-16 01:51:09 所属栏目:百科 来源:网络整理
导读:我有一个服务在循环中运行一些不同的任务,直到服务停止. 但是,我调用Web服务和此调用的其中一个任务可能需要几分钟才能完成.我希望能够立即停止服务,“取消”Web服务调用而不调用Thread.Abort,因为这会导致一些奇怪的行为,即使线程正在做的唯一事情是调用此W
我有一个服务在循环中运行一些不同的任务,直到服务停止.
但是,我调用Web服务和此调用的其中一个任务可能需要几分钟才能完成.我希望能够立即停止服务,“取消”Web服务调用而不调用Thread.Abort,因为这会导致一些奇怪的行为,即使线程正在做的唯一事情是调用此Web服务方法.

如何取消或中断同步方法调用(如果可能的话)?
或者我应该尝试不同的方法?

我试图使用AutoResetEvent,然后调用Thread.Abort,它在下面的代码示例中运行正常,但是当在实际服务中实现此解决方案时,我得到一些意外的行为,可能是因为外部库中发生了什么我是使用.

AutoResetEvent和Thread.Abort:

class Program
{
    static void Main(string[] args)
    {
        MainProgram p = new MainProgram();
        p.Start();
        var key = Console.ReadKey();
        if (key.Key == ConsoleKey.Q)
            p.Stop();
    }
}

class MainProgram
{
    private Thread workerThread;
    private Thread webServiceCallerThread;
    private volatile bool doWork;

    public void Start()
    {
        workerThread = new Thread(() => DoWork());
        doWork = true;
        workerThread.Start();
    }

    public void Stop()
    {
        doWork = false;
        webServiceCallerThread.Abort();
    }

    private void DoWork()
    {
        try
        {
            while (doWork)
            {
                AutoResetEvent are = new AutoResetEvent(false);
                WebServiceCaller caller = new WebServiceCaller(are);
                webServiceCallerThread = new Thread(() => caller.TimeConsumingMethod());
                webServiceCallerThread.Start();

                // Wait for the WebServiceCaller.TimeConsumingMethod to finish
                WaitHandle.WaitAll(new[] { are });

                // If doWork has been signalled to stop
                if (!doWork)
                    break;

                // All good - continue
                Console.WriteLine(caller.Result);
            }
        }
        catch (Exception e)
        {
            Console.Write(e);
        }
    }
}

class WebServiceCaller
{
    private AutoResetEvent ev;
    private int result;

    public int Result
    {
        get { return result; }
    }

    public WebServiceCaller(AutoResetEvent ev)
    {
        this.ev = ev;
    }

    public void TimeConsumingMethod()
    {
        try
        {
            // Simulates a method running for 1 minute
            Thread.Sleep(60000);
            result = 1;
            ev.Set();
        }
        catch (ThreadAbortException e)
        {
            ev.Set();
            result = -1;
            Console.WriteLine(e);
        }
    }
}

有人可以建议解决这个问题吗?

解决方法

解决方案非常简单:除非您想要阻止几分钟,否则不要拨打几分钟的电话.如果在没有阻塞的情况下无法做任何特定事情,可能持续几分钟,就会大声抱怨编写强制要求的代码(或者如果可能的话自己修复).

一旦你打完电话,就太晚了.你承诺了.如果您调用的函数没有提供中止它的安全方法,那么就没有安全的方法了.

(编辑:李大同)

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

    推荐文章
      热点阅读