【发布时间】:2015-12-03 15:43:32
【问题描述】:
我想知道这种情况是否是线程安全的,是否存在我目前没有看到的问题:
我从 ASP.net 控制器调用非静态类的非静态方法(这个类在另一个项目中,并且类被注入到控制器中)。
这个方法(它是非静态的)做一些工作并调用一些其他的静态方法,传递给它 userId
最后静态方法做了一些工作(需要userId)
我相信这种方法是线程安全的,如果两个用户同时调用此方法(假设在同一纳秒内),一切都会正确完成。我是正确的还是完全错误的?如果我错了,在 ASP.net 项目中使用静态方法的正确方法是什么?
编辑
这里是代码:)
这是来自控制器的调用:
await _workoutService.DeleteWorkoutByIdAsync(AzureRedisFeedsConnectionMultiplexer.GetRedisDatabase(),AzureRedisLeaderBoardConnectionMultiplexer.GetRedisDatabase(), workout.Id, userId);
DeleteWorkoutByIdAsync 如下所示:
public async Task<bool> DeleteWorkoutByIdAsync(IDatabase redisDb,IDatabase redisLeaderBoardDb, Guid id, string userId)
{
using (var databaseContext = new DatabaseContext())
{
var workout = await databaseContext.Trenings.FindAsync(id);
if (workout == null)
{
return false;
}
databaseContext.Trenings.Remove(workout);
await databaseContext.SaveChangesAsync();
await RedisFeedService.StaticDeleteFeedItemFromFeedsAsync(redisDb,redisLeaderBoardDb, userId, workout.TreningId.ToString());
}
return true;
}
您可以注意到 DeleteWorkoutByIdAsync 调用静态方法 StaticDeleteFeedItemFromFeedsAsync,如下所示:
public static async Task StaticDeleteFeedItemFromFeedsAsync(IDatabase redisDb,IDatabase redisLeaderBoardDd, string userId, string workoutId)
{
var deleteTasks = new List<Task>();
var feedAllRedisVals = await redisDb.ListRangeAsync("FeedAllWorkouts:" + userId);
DeleteItemFromRedisAsync(redisDb, feedAllRedisVals, "FeedAllWorkouts:" + userId, workoutId, ref deleteTasks);
await Task.WhenAll(deleteTasks);
}
这里是静态方法 DeleteItemFromRedisAsync,在 StaticDeleteFeedItemFromFeedsAsync 中调用:
private static void DeleteItemFromRedisAsync(IDatabase redisDb, RedisValue [] feed, string redisKey, string workoutId, ref List<Task> deleteTasks)
{
var itemToRemove = "";
foreach (var f in feed)
{
if (f.ToString().Contains(workoutId))
{
itemToRemove = f;
break;
}
}
if (!string.IsNullOrEmpty(itemToRemove))
{
deleteTasks.Add(redisDb.ListRemoveAsync(redisKey, itemToRemove));
}
}
【问题讨论】:
-
我认为您需要发布代码。某些东西是否是线程安全的(或不是)取决于可以执行的每一行代码。
-
如果静态函数只使用局部变量来完成所有工作,而不使用任何静态变量,那么你很好。否则,你一点都不好。但是你为什么不发布一些代码给我们看看呢?
-
@hyperN 你的编辑改变了一切。您本质上是在询问 async/await 是否是线程安全的,这是一个截然不同的问题,需要一个更复杂的答案。
-
我希望我对 async/await 有足够的了解,能够回答您的问题。不幸的是,我不是。而且我什至担心,即使你进行了彻底的推理,得出了应该没问题的逻辑结论,除非你先进行压力测试,否则你可能不会知道它是否真的没问题。
-
@MikeNakis 感谢您的帮助:)