2012-02-07 72 views
0

这里是我的代码线程在窗口

public partial class MainWindow : Window 
{ 
    Thread ProgressThread; 
    Window w; 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     ProgressThread = new Thread(() => 
     { 
      w = new Window(); 
      RoundProgressBar objprogress=new RoundProgressBar(); 
      w = new Window(); 
      w.Margin = new Thickness(0, 0, 50, 0); 
      w.WindowState = WindowState.Normal; 
      w.WindowStartupLocation = WindowStartupLocation.CenterOwner; 
      w.Height = 80; 
      w.Width = 80; 
      w.ResizeMode = ResizeMode.NoResize; 
      w.AllowsTransparency = true; 
      w.WindowStyle = WindowStyle.None; 
      RoundProgressBar Progress = new RoundProgressBar(); 
      w.Content = objprogress; 
      w.ShowInTaskbar = false; 
      w.ShowDialog(); 
      w.Content = Progress; 
      w.ShowInTaskbar = false; 
      w.ShowDialog(); 

      w.Closed += (sender2, e2) => 
      w.Dispatcher.InvokeShutdown(); 

      System.Windows.Threading.Dispatcher.Run(); 
     }); 

     ProgressThread.SetApartmentState(ApartmentState.STA); 
     ProgressThread.Start(); 
    } 
} 

当我按一下按钮线程开始在屏幕中间的进度条。当我改变主屏幕,在不改变progree栏窗口。

我想显示那个窗口的中间进度条。如果我搬到任何地方。

w.Owner = this;

我知道这个代码的帮助下,这将工作perfect.but我在线程正在工作,所以这种错误是发生

“因为不同的线程拥有它调用线程不能访问此对象”

请帮我解决这个问题

回答

2

UI对象在UI线程上。你希望有一个后台线程来监视进程,但是随后你想在UI上更新任何东西,你需要重新发送回UI线程。

东西沿着这些路线:

private void button1_Click(object sender, RoutedEventArgs e) { 
    Task t = Task.Factory.StartNew(UpdateUI); 
} 

private void UpdateUI() { 
    Dispatcher.Invoke(
     new Action(() => { 
      textBox1.Text = "Henk"; 
      // etc etc, this would be your normal code 
     }) 
); 
} 

这篇文章解释它:http://msdn.microsoft.com/en-us/magazine/cc163328.aspx

如果可以使用async,那么你应该看看this的例子。这就是为什么这些痛苦通常会消除这些问题。

此致,Gert-Jan