什么时候使用Task.Delay和Thread.Sleep有很好的规则?
如果"await"点之后的调用图中的语句不访问任何类型不是从System.Windows.UIElement类派生的对象,那么我们可以说开发人员安全地使用ConfigureAwait(false)来获取Windows Mobile应用程序吗?
除了更新GUI元素之外,还必须在UI线程上执行哪种语句?
我只是想知道下面的代码中是否出现竞争条件:
int readingFiles;
async Task<string> ReadFile (string file)
{
++readingFiles;
var text = await Stream.ReadFileAsync(file);
--readingFiles;
return text;
}
Run Code Online (Sandbox Code Playgroud)
如果线程池线程执行ReadFile方法,则readFiles将由两个不同的线程访问,而readingFiles变量不受任何同步惯用法的保护.
这意味着对于执行"--readingFiles"的其他线程,readFiles的第一次更新不应该是可见的.但是,在"--readingFiles"之后,我从未见过readFiles等于-1.我检查同一个线程是否使用Thread.CurrentThread执行++和 - 操作.在大多数情况下,它不是同一个线程,我仍然没有看到readingFiles为-1.
即使存在竞争条件且readingFiles不易变,为什么我不能看到这种竞争条件的影响?