C# ios任务、coregraphics动画

C# ios任务、coregraphics动画,c#,ios,.net,multithreading,xamarin,C#,Ios,.net,Multithreading,Xamarin,最近,我使用XamarinIDE,编写了一些基本的代码,比如“动画”。在另一个类似这样的任务中更新UIView是一种很好的编码方式吗?我编写了一个类UIBackgroundView类,它在重写的“Draw”方法中通过给定的路径和圆弧生成CoreGraphics圆 public override void ViewDidLoad() { base.ViewDidLoad(); //加载视图后,通常从nib执行任何附加设置。 backgroundView.BackgroundColor=新UICol

最近,我使用XamarinIDE,编写了一些基本的代码,比如“动画”。在另一个类似这样的任务中更新UIView是一种很好的编码方式吗?我编写了一个类UIBackgroundView类,它在重写的“Draw”方法中通过给定的路径和圆弧生成CoreGraphics圆

public override void ViewDidLoad()
{
base.ViewDidLoad();
//加载视图后,通常从nib执行任何附加设置。
backgroundView.BackgroundColor=新UIColor(0,0,0,0);
backgroundView.arcs=新列表();
对于(int n=0;n<10;n++)
{
x=rand.Next(0,(int)backgroundView.Bounds.Width);
y=rand.Next(0,(int)backgroundView.Bounds.Height);
backgroundView.arcs.Add(新弧(x,y,7*n,0,(nfloat)(2*Math.PI),true,
新CGColor(0,
(浮动)下一个兰特(70100)/100,
(浮动)下一级兰德(70100)/1000.2f,(浮动)下一级兰德(50300)/100);
}
backgroundView.SetNeedsDisplay();
任务任务=新任务(生成循环);
task.Start();
}
无效生成圆()
{
while(true)
{
对于(int n=0;n<10;n++)
{
if(背景视图.arcs[n].y+backgroundView.arcs[n].radius>0)
backgroundView.arcs[n].y-=backgroundView.arcs[n].速度;
其他的
{
backgroundView.arcs[n].y=backgroundView.Bounds.Height+backgroundView.arcs[n].radius;
backgroundView.arcs[n].color=newcgcolor(0,(float)rand.Next(70100)/100,(float)rand.Next(70100)/100,0.2f);
}
}
InvokeOnMainThread(()=>backgroundView.SetNeedsDisplay());
睡眠(10);
}
}

如果没有其他内容,则需要锁在线程之间共享数据(
backgroundView
及其内容)。您有任何示例吗?我是线程新手。任务,我习惯于回调和线程轮询。基本上,线程很难正确执行。有很多东西你需要知道,如果没有这些东西,你的程序看起来可能会工作,但在适当的情况下会导致它付之一炬。这不是那种你可以通过实验或从各处窃取代码来正确完成的事情。如果你真的想学习所有这些东西,我推荐乔·阿尔巴哈里(Joe Albahari)的C#threading书(可免费获得PDF格式)。如果您还没有准备好进行大量学习,我建议您避免使用多线程。
public override void ViewDidLoad()
    {
        base.ViewDidLoad();
        // Perform any additional setup after loading the view, typically from a nib.
        backgroundView.BackgroundColor = new UIColor(0, 0, 0, 0);
        backgroundView.arcs = new List<Arc>();
        for (int n = 0; n < 10; n++)
        {
            x = rand.Next(0, (int)backgroundView.Bounds.Width);
            y = rand.Next(0, (int)backgroundView.Bounds.Height);
            backgroundView.arcs.Add(new Arc(x, y, 7 * n, 0, (nfloat)(2 * Math.PI), true,
                                            new CGColor(0,
                                                        (float)rand.Next(70, 100) / 100,
                                                        (float)rand.Next(70, 100) / 100, 0.2f), (float)rand.Next(50, 300) / 100));
        }
        backgroundView.SetNeedsDisplay();
        Task task = new Task(generateCircles);
        task.Start();
    }

    void generateCircles()
    {

        while (true)
        {
            for (int n = 0; n < 10; n++)
            {
                if (backgroundView.arcs[n].y + backgroundView.arcs[n].radius > 0)
                    backgroundView.arcs[n].y -= backgroundView.arcs[n].speed;
                else
                {
                    backgroundView.arcs[n].y = backgroundView.Bounds.Height + backgroundView.arcs[n].radius;
                    backgroundView.arcs[n].color = new CGColor(0, (float)rand.Next(70, 100) / 100, (float)rand.Next(70, 100) / 100, 0.2f);
                }
            }
            InvokeOnMainThread(() => backgroundView.SetNeedsDisplay());
            Thread.Sleep(10);
        }

    }