Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.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#_Windows Phone 8.1_Mutex - Fatal编程技术网

C# 获取互斥后调用等待操作

C# 获取互斥后调用等待操作,c#,windows-phone-8.1,mutex,C#,Windows Phone 8.1,Mutex,在获取互斥锁后,如何使用wait FileIO.WriteTextAsync()(在Windows Phone 8.1中)写入文件,以便没有两个线程访问同一个文件,并确保互斥。我正在做以下工作: mutex.WaitOne() try { await FileIO.WriteTextAsync(filename, text); Debug.WriteLine("written"); } finally { mutex.ReleaseMutex(); } 但是该方法只适

在获取
互斥锁后,如何使用
wait FileIO.WriteTextAsync()
(在Windows Phone 8.1中)写入文件,以便没有两个线程访问同一个文件,并确保互斥。我正在做以下工作:

mutex.WaitOne()

try
{
    await FileIO.WriteTextAsync(filename, text);
    Debug.WriteLine("written");
}
finally
{
    mutex.ReleaseMutex();
}

但是该方法只适用于一到两次迭代,然后抛出一个
System.Exception
。另外,如果我删除
wait
关键字或完全删除文件写入方法,代码运行得非常好。所以,所有的麻烦都是由调用异步方法引起的。如何解决此问题?

这是监视器的工作(或使其更异步友好,信号量),而不是互斥

问题是,
WriteTextAsync
的延续很可能在单独的线程上运行,因此它无法释放互斥锁-这只能从最初获取互斥锁的同一线程中完成

var semaphore = new SemaphoreSlim(1);

await semaphore.WaitAsync();

try
{
    await FileIO.WriteTextAsync(filename, text);
    Debug.WriteLine("written");
}
finally
{
    semaphore.Release();
}

如果您在同一进程中保护资源,那么您应该执行此任务。如果您需要在进程之间保护资源(我认为互斥的主要角色),那么请查看。