使用线程阻塞操作取消并行任务

时间:2018-01-06 14:20:09

标签: c# multithreading parallel-processing task task-parallel-library

我正在使用一个具有几个线程阻塞异常的库来从共享元组空间获取数据。我有一个大厅启动并运行,但我无法正确终止程序,控制台没有响应任何东西,但没有挂起或关闭。我有以下代码:

public static Main(string[] args){
    bool continueSession = true;
    ISpace lobbySpace = new SequentialSpace(); // part of tuple space library
    var tokenSource = new CancellationTokenSource();
    var cancelToken = tokenSource.Token;
    var reader = Task.Run(async () =>
        {
            return await ChatReader(lobbySpace);
        });
    var sender = Task.Run(async () =>
        {
            return await ChatSender(lobbySpace);
        });
    try {
        reader.Wait(cancelToken);
        sender.Wait(cancelToken);
    }
    catch(Exception ex){
        System.Console.WriteLine(ex.Message);
    }

    while (continueSession) { }
    tokenSource.Cancel();
}

public async Task<bool> ChatReader(ISpace space){
    while (continueSession){
        var rcv = space.Query (/* snipped */); // a thread-blocking operation
        var rcvMsg = (string) rcv[2]; //message received
        // ... some simple computations ...
        if (rcvMsg == "!quit" /* and name is different from senders name*/){
            continueSession = false;
            return false;
        }
        // format and print message
    }
    return true;
}
public async Task<bool> ChatSender(ISpace space){
    while(continueSession){
        var msg = Console.ReadLine(); // also blocks thread until input received
        space.Put(/* some data */);
        if (msg == "!quit"){
            continueSession = false;
            return false;
        }
    }
    return true;
}

当发件人看到你写“!quit”时应该发生的事情是两个任务都应该终止,因为令牌被设置为取消而主要方法应该结束。我可以看到,在VS调试器中,'reader'和'sender'的线程已经死了,但由于某种原因,程序运行的控制台窗口变得难以处理,程序也不会终止。

1 个答案:

答案 0 :(得分:0)

我能够解决我正在使用的库中存在的问题。我打开一个TCP端口与其他客户端通信,并且在发送命令并且Main-method终止后端口保持打开状态,强制程序也保持运行,尽管对象在那时超出了范围。 / p>

已关闭,因为这与程序的并行性无关。