Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建一个一次只能从一个线程执行的异步方法?_C#_Multithreading_Asynchronous_Locking - Fatal编程技术网

C# 如何创建一个一次只能从一个线程执行的异步方法?

C# 如何创建一个一次只能从一个线程执行的异步方法?,c#,multithreading,asynchronous,locking,C#,Multithreading,Asynchronous,Locking,我有一个IO.Stream,我需要写入它,然后从中读取。由于响应直接绑定到发送的数据,因此我需要防止此方法并行执行,以便保证其完整性。现在,我也希望这个方法是可以期待的,这是可能的吗?我将流包装成一个同步的蒸汽,这将防止读写过程中的干扰,但不能保证保持正确的读写操作顺序。我对如何实现这一点有些迷茫,因为如果我想使用异步等待方法,我就不能锁定流 您可以使用信号量lim.WaitAsync static SemaphoreSlim semaphoreSlim = new SemaphoreS

我有一个IO.Stream,我需要写入它,然后从中读取。由于响应直接绑定到发送的数据,因此我需要防止此方法并行执行,以便保证其完整性。现在,我也希望这个方法是可以期待的,这是可能的吗?我将流包装成一个同步的蒸汽,这将防止读写过程中的干扰,但不能保证保持正确的读写操作顺序。我对如何实现这一点有些迷茫,因为如果我想使用异步等待方法,我就不能锁定流

您可以使用
信号量lim.WaitAsync

    static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1,1);
    //Asynchronously wait to enter the Semaphore. If no-one has been granted access to the Semaphore, code execution will proceed, otherwise this thread waits here until the semaphore is released
    await semaphoreSlim.WaitAsync();
    try
    {
        await Task.Delay(1000);
    }
    finally
    {
        semaphoreSlim.Release();
    }

谢谢你的回答,我找到了一个不同的解决方案。我正在将send命令排入队列,并将它们与在单独线程中读取的响应进行匹配。因为写入和读取是串行的,所以它们可以按顺序安全地匹配。

TPL数据流听起来可能适合您参考:您不应该担心哪些线程同时调用相同的方法:您应该担心哪些线程访问相同的数据。可能有不同的线程执行不同的方法,但仍然存在问题,因为两种方法访问相同的数据。其他时候,您可以在同一时间在同一方法中有不同的线程,但不会有问题,因为它们使用该方法操作不同的数据。