gpt4 book ai didi

c# - 如何优雅地重启任务?

转载 作者:行者123 更新时间:2023-11-30 22:34:57 25 4
gpt4 key购买 nike

所以我有这样的东西:

Task.Factory.FromAsync<TcpClient>(tcpListener.BeginAcceptTcpClient, tcpListener.EndAcceptTcpClient, tcpListener).ContinueWith(ConnectionAccepted);

private void ConnectionAccepted(Task<TcpClient> tcpClientTask)
{
TcpClient tcpClient = tcpClientTask.Result;

// Do something with tcpClient
}

现在我想知道,如何启动 Task.Factory.FromAsync<TcpClient>(...)再次在此方法的末尾?我不能真的只是复制和粘贴代码行,因为我无权访问 TcpListener 并且不想使它成为成员变量。即使我这样做了,它也是这么长的一行代码,对我来说有点像代码重复。

Tasks 框架是否提供某种机制来完成此任务?

谢谢。

最佳答案

正如 svick 所建议的,最简单的方法是将 tcpListener 放入一个字段中。但如果由于某种原因你不能这样做,试试这个模式:

void AcceptClient()
{
// Create tcpListener here.
AcceptClientImpl(tcpListener);
}

void AcceptClientImpl(TcpListener tcpListener)
{
Task.Factory.FromAsync<TcpClient>(tcpListener.BeginAcceptTcpClient, tcpListener.EndAcceptTcpClient, tcpListener).ContinueWith(antecedent =>
{
ConnectionAccepted(antecedent.Result);

// Restart task by calling AcceptClientImpl "recursively".
// Note, this is called from the thread pool. So no stack overflows.
AcceptClientImpl(tcpListener);
});
}

void ConnectionAccepted(TcpClient tcpClient)
{
// Do stuff here.
}

关于c# - 如何优雅地重启任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7617645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com