我有一个应用程序,我在其中将azure appendblob作为 csv 登录。我正在使用 LinqToCsv->CsvContext 写为 csv。
每次我写日志时,我都会检查 appendblob 是否有任何长度,如果它为零,那么我将标题写入 csv。在我以多线程方式进行测试之前,一切都运行良好。因此,标头不会写入一次,而是在 csv 中多次写入。
我使用lock语句阻止多个线程访问语句块,但它没有按预期工作。
请让我知道我在这里做错了什么。
这是我的代码:
public async Task WriteToAudit(AuditData auditData)
{
_auditBlobName = Utilities.GetAuditAppendBlobName(auditData.Container);
var appendBlob = await GetAppendBlobReferenceAsync();
var list = new List<AuditData> { auditData };
var auditDataBytes = CloudAppendBlobHelper.WriteCsvWithHeaderToMemory(list, appendBlob);
using (var stream = new MemoryStream(auditDataBytes))
{
await appendBlob.AppendBlockAsync(stream).ConfigureAwait(false);
}
}
public static class CloudAppendBlobHelper
{
private static readonly object syncLock = new object();
public static byte[] WriteCsvWithHeaderToMemory(IEnumerable<AuditData> records, CloudAppendBlob appendBlob)
{
lock (syncLock)
{
appendBlob.FetchAttributes();
var outputFileDescription = new CsvFileDescription
{
SeparatorChar = ',',
EnforceCsvColumnAttribute = true,
FirstLineHasColumnNames = appendBlob.Properties.Length <= 0
};
using (var memoryStream = new MemoryStream())
{
using (var streamWriter = new StreamWriter(memoryStream))
{
var context = new CsvContext();
context.Write(records, streamWriter, outputFileDescription);
}
return memoryStream.ToArray();
}
}
}
}