【发布时间】:2021-01-04 18:20:59
【问题描述】:
我有以下发送多条短信的功能:
BulkSMSSenderResult bulkResult = new BulkSMSSenderResult();
if (BulkRequest.Requests.Any()) {
IEnumerable<(SMSSenderRequest, Task<Nito.Try<SMSSenderResult>>)> sendSmsTasks
= BulkRequest.Requests.Select(request => (request, SendSingleSmsAsync(request)));
await Task.WhenAll(sendSmsTasks.Select(task => task.Item2));
sendSmsTasks.ToList()
.ForEach(task => {
(SMSSenderRequest request, Task<Nito.Try<SMSSenderResult>> tryResult) = task;
_ = tryResult.Result.Match<Either<ErrorMessage, SMSSenderResult>>(
exception => new ErrorMessage(exception, request),
value => value
)
.Match(
result => bulkResult.Add(result),
error => bulkResult.Add(error)
);
});
}
if (BulkRequest.BadRequests.Any()) {
bulkResult.InvalidRequests = BulkRequest.BadRequests;
}
WriteResponseAsync(context, StatusCodes.Status207MultiStatus, bulkResult);
这几乎按预期工作,但似乎所有 SMS 都发送了两次。
我认为问题可能出在这一行:
await Task.WhenAll(sendSmsTasks.Select(task => task.Item2));
我的期望是这一行应该检查 SMS 是否已发送,以便后面的代码可以安全执行。
但是,这行代码和后面的代码似乎都导致SendSingleSmsAsync(request) 执行...或者其他原因(我无法推测)导致了这项工作触发两次(我确信SendSingleSmsAsync(request) 本身工作正常)。
任何想法如何解决这个问题?
【问题讨论】:
标签: c# multithreading collections thread-safety