小编Mou*_*dos的帖子

停止读取MSMQ的服务

我是一名Java程序员,他被要求对C#应用程序进行一些更改.我已经和C#一起工作了一个星期了,而且我终于找到了一个观察文档没有帮助的地方,当我谷歌时我找不到解决方案.

在这种情况下,我有一个Windows服务来处理到达MSMQ的消息.当收到一条消息时,当前正在侦听的线程将其拾取并开始执行需要几秒钟的操作.

public void Start()
{
    this.listen = true;
    for (int i = 0; i < Constants.ThreadMaxCount; i++)
    {
        ThreadPool.QueueUserWorkItem(new WaitCallback(this.StartListening), i);
    }
    ...

private void StartListening(Object threadContext)
{

    int threadId = (int)threadContext;
    threads[threadId] = Thread.CurrentThread;
    PostRequest postReq;
    while(this.listen)
    {
        System.Threading.Monitor.Enter(locker);
        try
        {

            postReq = GettingAMessage();
        }
        finally
        {
            System.Threading.Monitor.Exit(locker);
        }
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

GettingAMessage()具有以下监听消息的行:

Task<Message> ts = Task.Factory.FromAsync<Message>
    (queue.BeginReceive(), queue.EndReceive);
ts.Wait();
Run Code Online (Sandbox Code Playgroud)

问题是,当调用Stop()方法并且没有消息进入MSMQ时,线程都坐在那里等待消息.我尝试过使用超时,但这种方法对我来说似乎并不优雅(并且切换到了Task Factory,我不知道如何实现它们).我的解决方案是将每个线程的引用添加到数组中,以便我可以取消它们.创建后,每个工作线程调用以下内容.

threads[threadId] = Thread.CurrentThread;
Run Code Online (Sandbox Code Playgroud)

然后应该被中止

public void Stop()
{
    try
    {
        this.listen = false;
        foreach(Thread a in …
Run Code Online (Sandbox Code Playgroud)

c# msmq thread-abort

7
推荐指数
1
解决办法
1345
查看次数

标签 统计

c# ×1

msmq ×1

thread-abort ×1