c#线程和属性第二部分

时间:2009-02-20 16:00:48

标签: c# winforms multithreading

我有这段代码:

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)
        {
            ...
        }
    }
}

如何更新图片?我想保存一份图像副本,以便在用户需要时更新pictureBox。

谢谢!

2 个答案:

答案 0 :(得分:2)

您的代码将完美运行。但是,如果您想从另一个线程中读取值并确保始终获得最新值,则应该在每次读取或写入时使其变为volatile或获取锁定。

有关详细信息,请参阅the memory model section of my threading article

答案 1 :(得分:1)

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

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

此同步方法为not 100% safe in all circumstances,但出于您的目的,它应该可以正常工作