【问题标题】:change code from C# windows form to class将代码从 C# windows 窗体更改为类
【发布时间】:2018-09-02 15:42:10
【问题描述】:

嗨,我有这个 Windows 窗体,但我需要修改代码,以便它作为类而不是窗体运行。 InvokeRequired 和 Invoke 函数阻止了我这样做。我已经更新了代码以显示完整的类。代码不断更新以检查整个值列表是否已更改

using System;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Ets2SdkClient.Demo
{
public partial class Ets2SdkClientDemo : Form
{
    public Ets2SdkTelemetry Telemetry;

    public Ets2SdkClientDemo()
    {
        InitializeComponent();

        Telemetry = new Ets2SdkTelemetry();
        Telemetry.Data += Telemetry_Data;

        Telemetry.JobFinished += TelemetryOnJobFinished;
        Telemetry.JobStarted += TelemetryOnJobStarted;


    }

    private void TelemetryOnJobFinished(object sender, EventArgs args)
    {
        MessageBox.Show("Job finished, or at least unloaded nearby cargo destination.");
    }

    private void TelemetryOnJobStarted(object sender, EventArgs e)
    {
        MessageBox.Show("Just started job OR loaded game with active.");
    }

    private void Telemetry_Data(Ets2Telemetry data, bool updated)
    {
        try
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new TelemetryData(Telemetry_Data), new object[2] { data, updated });
                return;
            }


            // Do some magic trickery to display ALL info:
            var grps = new object[]
                   {
                       data.Drivetrain, data.Physics, data.Controls, data.Axilliary, data.Damage, data.Lights, data.Job
                   };

            foreach (var grp in grps)
            {
                // Find the right tab page:
                var grpName = grp.GetType().Name;
                if (grpName.StartsWith("_"))
                    grpName = grpName.Substring(1);



                // All properties;
                var props = grp.GetType().GetProperties().OrderBy(x => x.Name);
                var labels = new StringBuilder();
                var vals = new StringBuilder();
                foreach (var prop in props)
                {
                    labels.AppendLine(prop.Name + ":");
                    object val = prop.GetValue(grp, null);
                    if (val is float[])
                    {
                        vals.AppendLine(string.Join(", ", (val as float[]).Select(x=> x.ToString("0.000"))));
                    }
                    else
                    {
                        vals.AppendLine(val.ToString());
                    }
                }


            }
        }
        catch
        {
        }
    }
}

}

【问题讨论】:

  • 欢迎来到 Stack Overflow。如果您提供minimal reproducible example,我们可以为您提供更好的帮助。这意味着您应该提供足够的代码,以便任何人都可以复制/粘贴并运行它而不会出现任何错误。
  • 我不知道如何提供帮助,删除它并离开调用调用将是无限递归,除了在 UI 线程上调用自身之外,它实际上并没有做任何事情。我敢肯定这种方法还有更多内容,您应该可以完全删除这些行
  • @RonBeyer 无限递归如何?
  • @CamiloTerevinto 如果您对该行进行了转换,它只是通过委托调用自己,它会不断地调用自己。这就是为什么我说 id 并没有真正做任何事情(除了在 UI 线程上调用)并且可以完全删除,不需要“转换”。

标签: c# function class


【解决方案1】:

你不需要那个。您可以删除整个“if”块,因为 Invoke() 在这里所做的只是确保该方法在窗口运行所在的同一线程上执行。如果您没有窗口,则不再需要此操作。但是,您可能需要了解线程并发性(如果您的应用程序使用多个线程),并且可能必须包含锁以防止此类问题。

【讨论】:

  • 我想知道你怎么知道应用程序还没有使用多线程..?我非常怀疑没有太多经验的人会随机添加 Invoke 调用(我很可能认为他们在遇到多线程问题时复制了它......)。
  • @CamiloTerevinto:是的,我同意这一点,但另一方面,这是一个如此基本的问题,我担心这里的完整答案会很困难。 (此外没有提供足够的信息来帮助解决这个问题)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多