我有一个简单的课程:
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)吗?
答案 0 :(得分:0)
如果您尝试,是否会引发异常?由于您正在修改本机类型(整数),我不会期望异常,因此无法锁定这些类型,并且可以在多个线程上安全地访问这些类型。但是,您应该小心在多个线程中更改此类(状态)类型,因为这可能会以意外的方式更改行为并且很难跟踪