我有一个处理许多类似任务的管道。它按顺序有三个段,A,然后是B,然后是C(每个段可能有多个阶段)。 A和C是机器的本地,B是远程的。
B部分中的任务,即远程部分,需要连接才能工作。他们应该共享一个连接。
我想在第一个任务从A移动到B时创建连接,并在最后一个任务从B移动到C时关闭它。我该怎么办?
如果它使解决方案更容易,我可以接受以下一个或多个约束:
答案 0 :(得分:3)
我就是这样做的:
connection
变量设置为null
。connection
,然后再使用。Completed
属性找到,假设您正确传播完成),Dispose()
连接(如果已创建)。在代码中,作为辅助方法,它看起来像这样:
public static TransformBlock<TInput, TOutput>
CreateTransformBlockWithConnection<TInput, TOutput, TConnection>(
Func<TInput, TConnection, TOutput> transform,
Func<TConnection> connectionFactory)
where TConnection : class, IDisposable
{
TConnection connection = null;
var block = new TransformBlock<TInput, TOutput>(
input =>
{
if (connection == null)
connection = connectionFactory();
return transform(input, connection);
});
block.Completion.ContinueWith(
_ =>
{
if (connection != null)
connection.Dispose();
});
return block;
}
(请注意,如果connectionFactory
返回null
,这将无法正常运行。如果您对此感到担心,可以添加支票。)
用法示例(这会将每个字符串输入作为SQL命令执行并返回结果):
var block = CreateTransformBlockWithConnection(
(string input, SqlConnection connection) =>
new SqlCommand(input, connection).ExecuteScalar(),
() => new SqlConnection());