Отсутствует скобка в C# из-за фоновой задачи Windows IoT?

Я создал тестовое приложение для своего первого проекта Windows IoT с Raspberry Pi и ультразвуковым датчиком. Я поместил в него пример кода. Visual Studio говорит мне, что мне не хватает фигурных скобок в "публичном запуске void…", но это не проблема. Это из-за открытого класса в BackgroundTaskInstance?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Http;
using Windows.ApplicationModel.Background;
using Windows.Devices.Gpio;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;

// The Background Application template is documented at http://go.microsoft.com/fwlink/?LinkID=533884&clcid=0x409

namespace IoTtest
{
    public sealed class StartupTask : IBackgroundTask
    {
        public void Run(IBackgroundTaskInstance taskInstance)
        {
            public class HCSR04
        {
            private GpioPin triggerPin { get; set; }
            private GpioPin echoPin { get; set; }
            private Stopwatch timeWatcher;

            public HCSR04(int triggerPin, int echoPin)
            {
                GpioController controller = GpioController.GetDefault();
                timeWatcher = new Stopwatch();
                //initialize trigger pin.
                this.triggerPin = controller.OpenPin(triggerPin);
                this.triggerPin.SetDriveMode(GpioPinDriveMode.Output);
                this.triggerPin.Write(GpioPinValue.Low);
                //initialize echo pin.
                this.echoPin = controller.OpenPin(echoPin);
                this.echoPin.SetDriveMode(GpioPinDriveMode.Input);
            }

            public double GetDistance()
            {
                ManualResetEvent mre = new ManualResetEvent(false);
                mre.WaitOne(500);
                timeWatcher.Reset();
                //Send pulse
                this.triggerPin.Write(GpioPinValue.High);
                mre.WaitOne(TimeSpan.FromMilliseconds(0.01));
                this.triggerPin.Write(GpioPinValue.Low);
                return this.PulseIn(echoPin, GpioPinValue.High);
            }

            private double PulseIn(GpioPin echoPin, GpioPinValue value)
            {
                var t = Task.Run(() =>
                {
                    //Recieve pusle
                    while (this.echoPin.Read() != value)
                    {
                    }
                    timeWatcher.Start();

                    while (this.echoPin.Read() == value)
                    {
                    }
                    timeWatcher.Stop();
                    //Calculating distance
                    double distance = timeWatcher.Elapsed.TotalSeconds * 17000;
                    return distance;
                });
                bool didComplete = t.Wait(TimeSpan.FromMilliseconds(100));
                if (didComplete)
                {
                    return t.Result;
                }
                else
                {
                    return 0.0;
                }
            }

        }
    }
}

2 ответа

Я взял код и переформатировал его для вас. Пожалуйста, измените пространство имен на значение, которое вы хотели бы

using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;

namespace MyIotNamespace
{
    public sealed class StartupTask :IBackgroundTask
    {
        public void Run(IBackgroundTaskInstance taskInstance)
        {

        }

    }

    public class HCSR04
    {
        private GpioPin triggerPin { get; set; }
        private GpioPin echoPin { get; set; }
        private Stopwatch timeWatcher;

        public HCSR04(int triggerPin, int echoPin)
        {
            GpioController controller = GpioController.GetDefault();
            timeWatcher = new Stopwatch();
            //initialize trigger pin.
            this.triggerPin = controller.OpenPin(triggerPin);
            this.triggerPin.SetDriveMode(GpioPinDriveMode.Output);
            this.triggerPin.Write(GpioPinValue.Low);
            //initialize echo pin.
            this.echoPin = controller.OpenPin(echoPin);
            this.echoPin.SetDriveMode(GpioPinDriveMode.Input);
        }

        public double GetDistance()
        {
            ManualResetEvent mre = new ManualResetEvent(false);
            mre.WaitOne(500);
            timeWatcher.Reset();
            //Send pulse
            this.triggerPin.Write(GpioPinValue.High);
            mre.WaitOne(TimeSpan.FromMilliseconds(0.01));
            this.triggerPin.Write(GpioPinValue.Low);
            return this.PulseIn(echoPin, GpioPinValue.High);
        }

        private double PulseIn(GpioPin echoPin, GpioPinValue value)
        {
            var t = Task.Run(() =>
            {
                //Recieve pusle
                while(this.echoPin.Read() != value)
                {
                }
                timeWatcher.Start();

                while(this.echoPin.Read() == value)
                {
                }
                timeWatcher.Stop();
                //Calculating distance
                double distance = timeWatcher.Elapsed.TotalSeconds * 17000;
                return distance;
            });
            bool didComplete = t.Wait(TimeSpan.FromMilliseconds(100));
            if(didComplete)
            {
                return t.Result;
            }
            else
            {
                return 0.0;
            }
        }

    }

}

Вложенный класс не может существовать внутри функций. Вместо этого поместите HCSR04 в StartupTask.

См. https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/nested-types

Другие вопросы по тегам