Как создать 300 секундомеров в C # более эффективно? - PullRequest
0 голосов
/ 04 января 2019

Я создаю приложение UWP, которое должно измерять время, которое пользователь смотрит на объект. Это приложение имеет около 300 объектов для измерения времени. Для этого мы будем использовать около 300 таймеров. Для этого нам нужно будет создать 300 секундомеров по отдельности, что крайне неэффективно.

Таймер запускается, когда пользователь смотрит на соответствующий объект, и останавливается, когда пользователь больше не смотрит на соответствующий объект. Если взгляд пользователя снова фиксируется на соответствующем объекте, таймер, конечно, запускается снова. В конце все времена секундомеров будут сохранены в файл. Создание 300 секундомеров требует новой строки кода для каждого секундомера, которая не кажется очень эффективной. Я пытался автоматизировать процесс создания секундомера с помощью Enumerable.range, но до сих пор не смог найти решение.

    /// <summary>
    /// All stopwatches for every word. In our real code we will have around 300 stopwatches.
    /// </summary>
    Stopwatch Stopwatch1 = new Stopwatch();
    Stopwatch Stopwatch2 = new Stopwatch();
    Stopwatch Stopwatch3 = new Stopwatch();
    Stopwatch Stopwatch4 = new Stopwatch();
    Stopwatch Stopwatch5 = new Stopwatch();
    Stopwatch Stopwatch6 = new Stopwatch();
    Stopwatch Stopwatch7 = new Stopwatch();
    Stopwatch Stopwatch8 = new Stopwatch();
    Stopwatch Stopwatch9 = new Stopwatch();
    Stopwatch Stopwatch10 = new Stopwatch();

Ответы [ 3 ]

0 голосов
/ 04 января 2019

Итак, для начала вам нужно получить список доступных объектов. Вы можете использовать следующий код для создания универсального словаря, в котором хранится секундомер для каждого имеющегося у вас объекта. Существует также пример реализации метода, который генерирует обзорную съемку.

Вам все еще нужно добавить код, который вызывает методы start и stop.

class Program
{
    static Dictionary<object, Stopwatch> stopwatchesByObject;

    static void Main(string[] args)
    {
        List<object> objects = new List<object>();

        // now you have to fill the objects list...

        stopwatchesByObject = new Dictionary<object, Stopwatch>();
        foreach (var o in objects)
        {
            stopwatchesByObject.Add(o, new Stopwatch());
        }
    }

    // Call this method when the user starts gazing at object o
    static void StartGazingAt(object o)
    {
        stopwatchesByObject[o].Start();
    }

    // Call this method when the user stops gazing at object o
    static void StopGazingAt(object o)
    {
        stopwatchesByObject[o].Stop();
    }

    static void CreateStatistics()
    {
        StringBuilder sb = new StringBuilder();
        foreach (var entry in stopwatchesByObject)
        {
            sb.AppendLine($"Gazed at {entry.Key.ToString()} for {entry.Value.Elapsed.TotalSeconds} seconds.");
        }
        File.WriteAllText("c:\\temp\\statictics.txt", sb.ToString());
    }
}
0 голосов
/ 04 января 2019

Мне понравился подход Стефана Иллнерса и я хотел добавить немного linq-magic, который, на мой взгляд, действительно аккуратный и хорошо читаемый.

using System.Linq;

var myListOfItemsToWatch = new List<object> { "foo", "bar", "baz" };
var listOfStopwatches = myListOfItemsToWatch.ToDictionary(watchItem =>
        watchItem, i => new Stopwatch()
);
0 голосов
/ 04 января 2019

Только определите List<Stopwatch>()

var l = new List<Stopwatch>();
     for (var i = 0; i < 300; i++)
     {
         var w = Stopwatch.StartNew();

         w.Stop();
         l.Add(w);
     }

Чтобы показать вам, как с этим справиться, посмотрите этот пример

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        public static List<Stopwatch> sws = new List<Stopwatch>();
        public static List<Thread> threads = new List<Thread>();

        static void Main()
        {
            for (var i = 0; i < 300; i++)
            {               
                threads.Add(new Thread(Dummy));
                sws.Add(new Stopwatch());
            }

            for(int i = 0; i < 300; i++) sws[i].Start();

            new Thread( () => { for(int i = 0; i < 5; i++) threads[i].Start(i); }).Start();
            new Thread( () => { for(int i = 5; i < 10; i++) threads[i].Start(i); }).Start();
            new Thread( () => { for(int i = 10; i < 15; i++) threads[i].Start(i); }).Start();
            new Thread( () => { for(int i = 15; i < 20; i++) threads[i].Start(i); }).Start();
            new Thread( () => { for(int i = 20; i < 25; i++) threads[i].Start(i); }).Start();
            new Thread( () => { for(int i = 25; i < 30; i++) threads[i].Start(i); }).Start();
            new Thread( () => { for(int i = 30; i < 35; i++) threads[i].Start(i); }).Start();
            new Thread( () => { for(int i = 35; i < 40; i++) threads[i].Start(i); }).Start();

            Console.Read();
        }

        static void Dummy(object data)
        {
            int i = (int)data;
            Thread.Sleep(250); 
            sws[i].Stop();
            Console.WriteLine(sws[i].ElapsedMilliseconds.ToString());
        }
    }
}     
...