- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个必须创建 RegistrationInput
的应用程序。对于我要转换为 RegistrationInput
的每个输入,我将 ID 保存在一个整数哈希集中,以确保我永远不会多次处理相同的输入。我需要异步创建我的输入数组的注册输入,但如果我在创建 RegistrationInputs
之一的过程中发现任何值不正确,我将返回 null 并从中删除 ID哈希集。
我正在做的事情是线程安全的吗?这也是异步处理数据的最佳方式吗?我已经用 async
lambda 尝试了 Parallel.Foreach
但它返回 async
void 所以我等不及了。
Inputs[] events = GetInputs();
List<Task<RegistrationInput>> tasks = new List<Task<RegistrationInput>>();
foreach (var ev in events)
tasks.Add(ProcessEvent(ev));
tempInputs = await Task.WhenAll<RegistrationInput>(tasks);
最佳答案
Is what I'm doing thread-safe?
不,一个 HashSet<T>
is not thread-safe .如果你需要从多个线程修改它,你需要使用 lock
:
Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.
您能做的最好的事情就是让这些并发操作完全不知道彼此,并有一些更高级别的机制来确保没有两个 ID 被查询两次。
Also is this the best way to asynchrously process data?
在我看来,您执行 ProcessEvent
的方向是正确的同时为每个事件。我唯一会做的就是重写 foreach
循环使用 Enumerable.Select
,但这是一个 flavor 问题:
Inputs[] events = GetInputs();
var tasks = events.Select(ev => ProcessEvent(ev));
tempInputs = await Task.WhenAll<RegistrationInput>(tasks);
关于c# - 在多个任务中编辑哈希集(一次?)线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33759519/
我是一名优秀的程序员,十分优秀!