изменить код из окна формы C # в класс - PullRequest
0 голосов
/ 02 сентября 2018

Привет, у меня есть одна форма окна, но мне нужно изменить код, чтобы он работал как класс, а не форма. Функции 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
        {
        }
    }
}

}

1 Ответ

0 голосов
/ 02 сентября 2018

Тебе это не нужно. Вы можете удалить весь блок «if», потому что все, что здесь делает Invoke (), - убедитесь, что метод выполняется в том же потоке, что и окно. Это больше не требуется, если у вас нет окна. Однако вам может понадобиться понять параллелизм потоков (если ваше приложение использует несколько потоков) и, возможно, вам придется включить блокировки, чтобы предотвратить такие проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...