【问题标题】:attempting to cycle between three images when if statement is met满足 if 语句时尝试在三个图像之间循环
【发布时间】:2017-04-05 21:05:34
【问题描述】:

我的代码中目前有四个 if 语句来更改某些显示。在InQueueInRing > 10if 语句中,我希望它在红色、黄色和绿色图像之间每0.5 秒循环一次,直到条件不再成立。我不知道从哪里开始骑自行车图像。我是否只是多次列出图像源并在它们之间加上Thread.Sleep(1000)

我尝试使用Loading new image each second 但我无法将类型 system.threading.timer 转换为 system.windows.media.imagesource。下面更新了代码。

以下是我的if 声明

    if (e.CmsData.Skill.AgentsAvailable > 0)
    {
        Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(() =>
        {
            callsWaitingData.Text = e.CmsData.Skill.AgentsAvailable.ToString();
            callsWaitingData.Foreground = new SolidColorBrush(Colors.Green);
            callsWaitingText.Text = "Available";
            callimgae.Source = new BitmapImage(new Uri("pack://application:,,,/ScoreBoardClientTest;component/images/circle_green.png", UriKind.Absolute));
        }));
    }
    else if (e.CmsData.Skill.InQueueInRing > 10)
    {
        Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(() =>
        {
            callsWaitingData.Text = e.CmsData.Skill.InQueueInRing.ToString();
            callsWaitingData.Foreground = new SolidColorBrush(Colors.Red);
            callsWaitingText.Text = "Waiting";
            timer = new system.threading.timer(OnTImerEllapsed, new object(), 0, 2000);
        }));
    }
    else if (e.CmsData.Skill.InQueueInRing > 0)
    {
        Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(() =>
        {
            callsWaitingData.Text = e.CmsData.Skill.InQueueInRing.ToString();
            callsWaitingData.Foreground = new SolidColorBrush(Colors.Red);
            callsWaitingText.Text = "Waiting";
            callimgae.Source = new BitmapImage(new Uri("pack://application:,,,/ScoreBoardClientTest;component/images/circle_red.png", UriKind.Absolute));
        }));
    }
    else if (e.CmsData.Skill.AgentsAvailable == 0)
    {
        Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(() =>
        {
            callsWaitingData.Text = e.CmsData.Skill.AgentsAvailable.ToString();
            callsWaitingData.Foreground = new SolidColorBrush(Colors.Yellow);
            callsWaitingText.Text = "Available";
            callimgae.Source = new BitmapImage(new Uri("pack://application:,,,/ScoreBoardClientTest;component/images/circle_yellow.png", UriKind.Absolute));
        }));
    }



private void OnTimerEllapsed(object state)
        {
            if (!this.Dispatcher.CheckAccess())
            {
                this.Dispatcher.Invoke(new Action(LoadImages));
            }
        }   

        private void LoadImages()
        {
            string stringUri = switcher ? @"pack://application:,,,/ScoreBoardClientTest;component/images/circle_red.png" :
                                          @"pack://application:,,,/ScoreBoardClientTest;component/images/circle_yellow.png";
                                         // @"pack://application:,,,/ScoreBoardClientTest;component/images/circle_green.png";
            this.callimgae.Source = new BitmapImage(new Uri(stringUri));

            switcher = !switcher;
        }  

【问题讨论】:

  • 用我找到的另一篇文章的新尝试更新了代码。
  • 还要注意,在我的尝试中,我尝试使用所有三个图像,但由于错误指出只能使用赋值、调用、递增、递减和新对象表达式,我不得不注释掉最后一个用作陈述。即使它不是一个声明并且格式正确。
  • 好的,我想我自己通过反复试验解决了这个问题。正确答案是问题,一旦堆栈溢出允许我这样做,我将自己标记为已回答。

标签: c#


【解决方案1】:

所以我看不到您的其余代码,但如果您要经常使用这些图像,请务必在执行此类操作之前预先加载或缓存它们(以提高性能)。

您可以使用很多线程/进程类,但我喜欢使用的一个简单的框架就是 Thread 类。这是设置线程的方法..

Thread myThread = new Thread(threadDelegate);

threadDelegate 属于 ThreadStart 类,这是您希望线程执行的工作。这是设置 threadDelegate 的一种方法..

ThreadStart threadDelegate = new ThreadStart(() => {
    while (isCycling == true)
    {
        // Your code here
        Thread.Sleep(1000);
    }
});

isCycling 是为了让循环在某些情况下停止,例如在一些奇怪的循环之后或过早退出。最后,您可以使用 start 方法让您的线程启动您提供的委托/工作。

myThread.Start();

如果您希望父线程(即主线程)等待线程停止或在循环完成之前不继续前进,您可以使用 myThread 上的 Join 方法。

【讨论】:

  • 所以作为一名新开发人员...我以前从未预加载图像,性能是我开始遇到的问题。你能帮忙吗?
  • 您使用 C# 在什么平台上工作?如果它是 WPF 或 ASP 或通用 C#,我可以为您指出正确的方向。如果它与 Unity 或 Unreal 或任何游戏引擎一起使用,我不会有太大帮助。我对它们了解不多,无法为您提供有关性能的明确答案。
  • 我使用 WPF 作为平台。 Visual Studio 15 虽然我确信这没什么区别。
  • 将图片加载到资源中。在 VS 中,您可以将复制的图像粘贴到资源选项卡中以方便使用。 msdn.microsoft.com/en-us/library/bbwz4bhx(v=vs.100).aspx
  • 是的,ferday 提到了一种提高性能的方法。创建一个资源文件将创建一个表格,该表格将保存您的图像,您可以使用您提供的唯一键检索图像。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
  • 2016-07-10
  • 2021-05-23
相关资源
最近更新 更多