c#将任务包装到另一个任务中

时间:2017-01-02 19:51:22

标签: c# async-await

我正在尝试使用进程间通信从我的程序的一个实例发送其内容到另一个实例。我在这里的代码正在工作,但它使第一个实例冻结,并且只在创建第二个instansce并且传回数据时才继续运行。我怀疑它是因为messaging_server0()不是异步任务。如何处理这个问题。有没有办法让messaging_server0异步?或者我错过了什么?

主循环包含这段代码

handleClick(e) {
    // Need to focus may be using refs, but not sure how to do it.
    return this.props.onClick(this.props.name);
}

另一方面我有messaging_server0

var makeTask = Task<string>.Factory.StartNew(() => pipe_server.messaging_server0());

if (makeTask.Result != null) { 
    dataGrid_logic.DataGridLoadTarget(makeTask.Result);
}

方法名称将被重构。

2 个答案:

答案 0 :(得分:1)

我建议采用以下方法:

    public static async Task<string> messaging_server0()
    {
        using (var messagebus1 = new TinyMessageBus("ExampleChannel"))

        {
            var taskCompletition = new TaskCompletionSource<string>();

            messagebus1.MessageReceived +=
                (sender, e) =>
                {
                    var ret = Encoding.UTF8.GetString(e.Message);
                    taskCompletition.TrySetResult(ret);
                };

            return await taskCompletition.Task;
        }
    }

显然你需要添加一些错误处理,如果需要可以超时等等。

答案 1 :(得分:1)

在alek kowalczyk和一些挖掘的帮助下,我想出了这段代码

    private async void xxx()
    {
        var makeTask = Task<string>.Factory.StartNew(() => pipe_server.messaging_server());

        await pipe_server.messaging_server();
        {
            dataGrid_logic.DataGridLoadTarget(makeTask.Result);

        }
    }

加上他发布的片段。 这非常有效。感谢