Я пытаюсь избавиться от NetworkStream
после его написания. Я попытался обертывание потока в using()
так:Как правильно утилизировать asyc NetworkStream
using (NetworkStream stream = client.GetStream())
{
foreach (byte[] command in fadeSceneOut)
{
if (stream.CanWrite)
{
stream.BeginWrite(command, 0, command.Length, new AsyncCallback(SendCallback), stream);
}
}
}
Но я получаю System.ObjectDisposedException
о том, что объект уже выброшен и не может быть доступен в моем обратном вызове, где я посылаю EndWrite()
:
private static void SendCallback(IAsyncResult ar)
{
try
{
NetworkStream stream = (NetworkStream)ar.AsyncState;
stream.EndWrite(ar);
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
Мое понимание заключалось в том, что поток не будет удален до тех пор, пока выполнение не покинет блок using
после того, как все команды будут записаны в поток. Очевидно, я здесь что-то не так, может кто-нибудь посоветовать правильный подход?
Редактировать: включали await
подход:
static void Main(string[] args)
{
Task.WaitAll(Run());
}
public static async Task Run()
{
// Get a scene
var scene = GrabSceneFromUser();
// Get scene commands
var fadeSceneIn = LightSwarmHelper.BuildSceneCommands(scene);
var fadeSceneOut = LightSwarmHelper.BuildSceneCommands(scene, false);
// Send commands to device
using (TcpClient client = new TcpClient(ConfigurationManager.AppSettings["Host"], Convert.ToInt32(ConfigurationManager.AppSettings["Port"])))
{
using (NetworkStream stream = client.GetStream())
{
foreach (byte[] command in fadeSceneOut)
{
if (stream.CanWrite)
{
await stream.WriteAsync(command, 0, command.Length); //stream.BeginWrite(command, 0, command.Length, new AsyncCallback(SendCallback), stream);
}
}
}
}
}
Этот код устарел, используйте ожидание. Затем вы создаете неограниченное количество одновременных отправлений. Это может легко исчерпать ресурсы. Выполняйте отправку последовательно. Это может даже привести к коррупции, не уверен. – usr
@usr Не знаком с 'await'. Невозможно найти примеры с помощью «NetworkStream», можете ли вы уточнить? – DGibbs
Google для «.net NetworkStream ждут». – usr