Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 控制WPF元素_C#_Wpf_Multithreading_C# 4.0 - Fatal编程技术网

C# 控制WPF元素

C# 控制WPF元素,c#,wpf,multithreading,c#-4.0,C#,Wpf,Multithreading,C# 4.0,我在一个类中声明了一个整数数组。使用该阵列,可以在栅格上绘制多段线。数组的元素是y坐标。阵列必须不断更新,然后显示值。我实现这个的想法是有两个线程。一个用于更新阵列的值,另一个用于在栅格上打印多段线。 更新阵列不是问题。当我尝试使用下面的代码在网格上打印多段线时,会引发一个异常,并显示以下消息:“调用线程无法访问此对象,因为其他线程拥有它。” 请建议使用线程解决此问题。也许,可以使用事件而不是线程?我愿意听取建议。感谢您的帮助 public partial class MainWindow :

我在一个类中声明了一个整数数组。使用该阵列,可以在栅格上绘制多段线。数组的元素是y坐标。阵列必须不断更新,然后显示值。我实现这个的想法是有两个线程。一个用于更新阵列的值,另一个用于在栅格上打印多段线。 更新阵列不是问题。当我尝试使用下面的代码在网格上打印多段线时,会引发一个异常,并显示以下消息:“调用线程无法访问此对象,因为其他线程拥有它。” 请建议使用线程解决此问题。也许,可以使用事件而不是线程?我愿意听取建议。感谢您的帮助

public partial class MainWindow : Window
{
    Polyline Wave = new Polyline();
    public MainWindow()
    {
        InitializeComponent();
        Refresh();
        DisplyOnGrid();
        ThreadStart child = new ThreadStart(DisplyOnGrid);
        Thread _DisplayOnGrid = new Thread(child);
        _DisplayOnGrid.Priority = ThreadPriority.Highest;
        _DisplayOnGrid.Start();
    }

    private void DisplyOnGrid()
    {
        Wave.Stroke = Brushes.Yellow;
        Wave.StrokeThickness = 1.25;
        for (int i = 0; i < DisplayGrid.Width; i++)
        {
            Wave.Points.Add(new Point(i, 50));
        }
        DisplayGrid.Children.Add(Wave);
    }

    private void Refresh()
    {
        DisplayGrid.Children.Clear();
    }
}
公共部分类主窗口:窗口
{
多段线波浪=新的多段线();
公共主窗口()
{
初始化组件();
刷新();
displayongrid();
ThreadStart child=新的ThreadStart(displayongrid);
线程_DisplayOnGrid=新线程(子线程);
_DisplayOnGrid.Priority=ThreadPriority.Highest;
_DisplayOnGrid.Start();
}
私人空间
{
Wave.Stroke=画笔.黄色;
波冲程厚度=1.25;
对于(int i=0;i
由于试图访问UI/Dispatcher线程所拥有的对象,所以出现错误 试着这样做:

 private void DisplyOnGrid()
 {
   Dispatcher.Invoke(new Action(()=> 
   {
    Wave.Stroke = Brushes.Yellow;
    Wave.StrokeThickness = 1.25;
    for (int i = 0; i < DisplayGrid.Width; i++)
    {
        Wave.Points.Add(new Point(i, 50));
    }
    DisplayGrid.Children.Add(Wave);
   }

 ))};
private void displayongrid()
{
Dispatcher.Invoke(新操作(()=>
{
Wave.Stroke=画笔.黄色;
波冲程厚度=1.25;
对于(int i=0;i
由于试图访问UI/Dispatcher线程所拥有的对象,所以出现错误 试着这样做:

 private void DisplyOnGrid()
 {
   Dispatcher.Invoke(new Action(()=> 
   {
    Wave.Stroke = Brushes.Yellow;
    Wave.StrokeThickness = 1.25;
    for (int i = 0; i < DisplayGrid.Width; i++)
    {
        Wave.Points.Add(new Point(i, 50));
    }
    DisplayGrid.Children.Add(Wave);
   }

 ))};
private void displayongrid()
{
Dispatcher.Invoke(新操作(()=>
{
Wave.Stroke=画笔.黄色;
波冲程厚度=1.25;
对于(int i=0;i
为什么要从网格中删除多段线,然后再添加它?您可以简单地替换它的
集合。除此之外,您应该使用答案中所示的调度程序,或者根本不使用线程,而是使用调度程序。为什么要从网格中删除多段线,然后再添加它?您可以简单地替换它的
集合。除此之外,您应该使用如答案所示的Dispatcher,或者可能根本不使用线程,而是使用Dispatcher。