【问题标题】:c# threads and properties second partc#线程和属性第二部分
【发布时间】:2009-02-20 16:00:47
【问题描述】:

我有这个代码:

public partial class FrmPrincipal : Form
{
    private Image imagen;

    public FrmPrincipal()
    {
        InitializeComponent();
        ...
    }

    private void menuItem1_Click(object sender, EventArgs e)
    {
        Thread t = new Thread(RequestImage);
        t.Start();
    }

    private void RequestImage()
    {
        try
        {
            ...

            // I want to update this.token
            this.imagen = retrieveImageFromWebService();

            ...
        }
        catch (Exception ex)
        {
            ...
        }
    }
}

如何更新图片?我想保存图像副本以在用户需要时更新图片框。

谢谢!

【问题讨论】:

  • 到底是什么问题?如果我没记错的话,该代码应该可以正常运行。
  • 您的意思是“我如何从另一个线程更新令牌”?
  • @vansfannel - 应该可以正常工作...
  • @Richard, @Kieron:效果很好。

标签: c# winforms multithreading


【解决方案1】:

您的代码可以正常运行。但是,如果您想从另一个线程读取值并确保始终获得最新的值,您应该将其设为 volatile 或在每次读取或写入时获取锁。

更多信息请参见the memory model section of my threading article

【讨论】:

    【解决方案2】:

    您那里的代码应该可以正常工作。如果您在另一个线程中使用令牌,您可能需要同步获取和设置以避免数据损坏:

    private string token {
      [MethodImpl(MethodImplOptions.Synchronized)] get;
      [MethodImpl(MethodImplOptions.Synchronized)] set;
    }
    

    这种同步方法是not 100% safe in all circumstances,但对于您的目的来说它应该可以工作

    【讨论】:

    • 这最终锁定了“this”,这通常是个坏主意。 IMO 最好锁定一个显式的私有锁。
    • Jon 当然提出了一个很好的观点——我在这里寻求最简单的解决方案,但最好使用单独的锁
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    相关资源
    最近更新 更多