在涉及线程时,试图理解.net的内存模型.这个问题是严格的理论问题,我知道它可以通过其他方式解决,例如使用lock
或标记_task
为volatile
.
以下面的代码为例:
class Test
{
Task _task;
int _working = 0;
public void Run()
{
if (Interlocked.CompareExchange(ref _working, 1, 0) == 0)
{
_task = Task.Factory.StartNew(() =>
{
//do some work...
});
_task.ContinueWith(antecendent => Interlocked.Exchange(ref _working, 0));
}
}
public void Dispose()
{
if (Interlocked.CompareExchange(ref _working, _working, 0) == 1)
{
_task.ContinueWith(antecendent => { /*do some other work*/ });
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在做出以下假设:
Run
可以多次调用(来自不同的线程),并且在调用之后永远不会Dispose
被调用.Dispose
将被称为恰好一次.现在我的问题是,_task
(在Dispose
方法中)的值是否总是一个"新的"值,这意味着它是从"主存储器"中读取而不是从寄存器中读取的?从我一直在阅读的内容 …
有人可以向我解释一下Task.Wait(CancellationToken)重载的用法吗?MSDN确实说了很多......
这就是我通常处理任务取消的方式:
var source = new CancellationTokenSource();
var task = Task.Factory.StartNew(() =>
{
while (true)
{
source.Token.ThrowIfCancellationRequested();
}
}, source.Token);
try
{
task.Wait();
}
catch (AggregateException exc)
{
exc.Flatten().Handle(e => e is OperationCanceledException);
}
Run Code Online (Sandbox Code Playgroud)
那么什么时候将令牌传递给Wait方法有用呢?
我对VIM不熟悉,我想知道:close
window命令和:hide
window命令之间的区别.我已经阅读了文档,但他们似乎都在做同样的事情......