相关疑难解决方法(0)

如何正确锁定值类型?

我正在阅读有关线程和锁定的内容.通常的做法是你不能(不应该)锁定值类型.

所以问题是,锁定值类型的推荐方法是什么?我知道有几种方法可以做一件事,但我还没有看到一个例子.虽然在MSDN论坛上有一个很好的主题,但我现在似乎无法找到它.

谢谢

c# locking

13
推荐指数
2
解决办法
5027
查看次数

锁定字段或局部变量?

在我从Marc 的回答中读到这个问题之后....

我有时会看到人们锁定局部变量.

这段代码坏了吗?

public void Do()
{
 object  o  = new Object();
 lock (o)
     {
      ...
     }
}
Run Code Online (Sandbox Code Playgroud)

我认为object o = new Object();应该在方法之外作为一个Field.

由于每个线程都获得了一个新实例o,因此会有多个锁.

我在这里错过了什么?在这种特定情况下,它不应该锁定字段吗?

.net c# multithreading locking .net-4.0

9
推荐指数
2
解决办法
7791
查看次数

锁定.Net - 是锁定参考还是对象?

假设我有这段代码:

object o1 = new Object();
object o2 = o1;
Run Code Online (Sandbox Code Playgroud)

获取o1锁定与获取o2上的锁定相同?(如果o1被锁定,将锁定o2阻塞直到o1被释放?)

.net c# multithreading locking

7
推荐指数
2
解决办法
1145
查看次数

除了"荣誉代码"之外,还有一个区别是使用专用的"锁定对象"并直接锁定数据吗?

我有两个线程:一个提供更新,另一个将它们写入磁盘.只有最新的更新很重要,所以我不需要PC队列.

简而言之:

  • 馈线线程将最新更新丢弃到缓冲区中,然后设置标志以指示新的更新.
  • writer线程检查该标志,如果它指示新内容,则将缓冲的更新写入磁盘并再次禁用该标志.

我目前正在使用专用锁对象来确保没有不一致,我想知道直接锁定标志和缓冲区有什么区别.我唯一知道的是,一个专用的锁对象需要信任,每个想要操纵标志和缓冲区的人都使用锁.

相关代码:

private object cacheStateLock = new object();
string textboxContents;
bool hasNewContents;

private void MainTextbox_TextChanged(object sender, TextChangedEventArgs e)
{
    lock (cacheStateLock)
    {
        textboxContents = MainTextbox.Text;
        hasNewContents = true;
    }
}

private void WriteCache() // running continually in a thread
{
    string toWrite;

    while (true)
    {
        lock (cacheStateLock)
        {
            if (!hasNewContents)
                continue;

            toWrite = textboxContents;
            hasNewContents = false;
        }

        File.WriteAllText(cacheFilePath, toWrite);
    }
}
Run Code Online (Sandbox Code Playgroud)

.net c# multithreading synchronization

6
推荐指数
1
解决办法
212
查看次数

标签 统计

c# ×4

.net ×3

locking ×3

multithreading ×3

.net-4.0 ×1

synchronization ×1