首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并发写入StorageFile

并发写入StorageFile
EN

Stack Overflow用户
提问于 2015-07-23 11:15:46
回答 5查看 880关注 0票数 0

如何在Windows 8.1中并发地将一些文本写入StorageFile?我试图实现lock在C#中提供的互斥对象,但无法在lock块中打开要写入的文件流。

这就是我要做的:

代码语言:javascript
复制
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 )的情况下仍然维护互斥和并发性?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-07-31 13:26:22

我用信号量解决了这个问题。我以前使用SlimSemaphore()获取并发布了一个带有单个资源的信号量,并将其写入文件。这启用了等待操作的使用,并消除了与lockmutex相关的限制,因为您可以在块中运行await操作( mutexlock实际上不允许这样做)。

代码语言:javascript
复制
// 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();
}
票数 1
EN

Stack Overflow用户

发布于 2015-07-23 12:21:58

AsyncLock操作中,您需要使用async而不是lock

代码语言:javascript
复制
    private readonly AsyncLock asyncLocker = new AsyncLock();
    .....
    using(await asyncLocker.LockAsync())
    {
       enter code here
    }

AsyncLock msdngithub

票数 2
EN

Stack Overflow用户

发布于 2015-07-23 18:31:05

通常,在这种情况下,您希望写入尽可能有序,并且希望将实际的写入卸载到另一个单一线程。下面是一个简化的示例,但是在大多数情况下,您需要优化它,以便在需要时结束并重新启动线程。

代码语言:javascript
复制
    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);
                            }
                        }
                    }
                }
            }
        });
    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31585748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档