修改存储在并发容器中的元素时需要同步对象?

时间:2018-04-26 11:05:34

标签: c# .net multithreading

我有一个简单的课程:

public class TaskResult
{
    public TaskResult()
    {
        CompletedSoFar = 0;
        Done = false;
    }

    [DataMember(Order = 0)]
    public int CompletedSoFar { get; set; }

    [DataMember(Order = 1)]
    public bool Done { get; set; }   
}

及其类型的对象存储在ConcurrentDictionary:

private static ConcurrentDictionary<Guid, TaskResult> _results;

并使用如下:

public TaskResult DoWork(int[] ids)
{
    var cancelSource = new CancellationTokenSource();
    var result = new TaskResult();
    _results[Guid.NewGuid()] = result;

    var task = System.Threading.Tasks.Task.Factory.StartNew(() =>
    {
        try
        {
            foreach (var id in ids)
            {
                cancelSource.Token.ThrowIfCancellationRequested();
                // Do work...
                result.CompletedSoFar++; // Increment work completed so far
            }

            result.Done = true; // Work now done
        }
        catch
        {
            throw;
        }
    }, cancelSource.Token);

    return result;
}

我可以在没有同步对象的情况下修改值(即CompletedSoFar,Done)吗?

1 个答案:

答案 0 :(得分:0)

如果您尝试,是否会引发异常?由于您正在修改本机类型(整数),我不会期望异常,因此无法锁定这些类型,并且可以在多个线程上安全地访问这些类型。但是,您应该小心在多个线程中更改此类(状态)类型,因为这可能会以意外的方式更改行为并且很难跟踪