如何在Windows 8.1中并发地将一些文本写入StorageFile?我试图实现lock在C#中提供的互斥对象,但无法在lock块中打开要写入的文件流。
这就是我要做的:
StorageFile file = await folder.GetFileAsync(logFileName);
// Lock file access object and open filestream for writing.
lock (fileLockObject)
{
StreamWriter writer = new StreamWriter(await file.OpenStreamForWriteAsync());
writer.Write(sometext);
}但lock不允许在其体内进行任何形式的async操作。如何在不使用第三方库(如AsyncLock )的情况下仍然维护互斥和并发性?
发布于 2015-07-31 13:26:22
我用信号量解决了这个问题。我以前使用SlimSemaphore()获取并发布了一个带有单个资源的信号量,并将其写入文件。这启用了等待操作的使用,并消除了与lock和mutex相关的限制,因为您可以在块中运行await操作( mutex和lock实际上不允许这样做)。
// define semaphore with only one resource to allocate.
SemaphoreSlim semaphore = new SemaphoreSlim(1);
// acquire semaphore
await semaphore.WaitAsync();
try { // write to file }
catch { // catch any exception }
finally
{
semaphore.Release();
}发布于 2015-07-23 12:21:58
在AsyncLock操作中,您需要使用async而不是lock
private readonly AsyncLock asyncLocker = new AsyncLock();
.....
using(await asyncLocker.LockAsync())
{
enter code here
}AsyncLock msdn,github
发布于 2015-07-23 18:31:05
通常,在这种情况下,您希望写入尽可能有序,并且希望将实际的写入卸载到另一个单一线程。下面是一个简化的示例,但是在大多数情况下,您需要优化它,以便在需要时结束并重新启动线程。
AutoResetEvent _waitHandle = new AutoResetEvent(false);
List<string> _writeCache = new List<string>();
bool _threadRunning = false;
void WriteToFile(string text)
{
lock (_writeCache)
{
_writeCache.Add(text);
_waitHandle.Set();
if(_threadRunning)
{
return;
}
_threadRunning = true;
}
Task.Run(async () =>
{
while (true)
{
_waitHandle.WaitOne();
StorageFile file = await folder.GetFileAsync(logFileName);
using (var f = await file.OpenStreamForWriteAsync())
{
using (StreamWriter writer = new StreamWriter(await file.OpenStreamForWriteAsync()))
{
lock (_writeCache)
{
while (_writeCache.Count > 0)
{
string s = _writeCache[0];
_writeCache.RemoveAt(0);
writer.Write(s);
}
}
}
}
}
});
}https://stackoverflow.com/questions/31585748
复制相似问题