Мог бы использовать руку с моим классом обертки таймера, было бы здорово - PullRequest
0 голосов
/ 09 августа 2011

Я хотя бы сузил свои ошибки в этом вопросе, но сейчас я просто застрял.Я нахожусь в том, что "это только кажется, что это должно работать", и я перефразирую только те же самые сообщения.Так.Я работаю с абстрактным базовым классом, который я хочу использовать для управления процессами загрузки данных.К этому классу я добавил экземпляр оболочки, которую написал для System.Threading.Timer.В конструкторе для моего таймера у меня есть два параметра: один - попытка передать абстрактный метод объекту Callback, другой - время для тикового события таймера, основанное на переменной экземпляра в конкретных / производных классах дляразличные процессы загрузки данных.

Вот мой код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Threading;
using HtmlAgilityPack;
using DataUtlitiesMain;
using TradeSystemObjects;
using System.Data.SqlClient;

namespace DataOperations
{
public abstract class DataRunManager
{
    DataRunTimer dataRunTimer;
    private abstract String HourForDataRunInMilitary; //Such as 16.0 for 4pm.

    public DataRunManager()
    {
        SetDataRunTimer();
    }

    private void SetDataRunTimer()
    {
        dataRunTimer = new DataRunTimer(MainDataRunProcedure(),GetMillisecondsUntilDataRun());
    }

    protected abstract static void MainDataRunProcedure(object state);

    //public abstract TimerCallback SetDataRunMainDelegate();

    private Int32 GetMillisecondsUntilDataRun()
    {
        DateTime now = DateTime.Now;
        DateTime targetTime = DateTime.Today.AddHours(Convert.ToDouble(HourForDataRunInMilitary));
        return (int)((targetTime - now).TotalMilliseconds);
    }
}

public class DataRunTimer
{
    Timer timer;

    public DataRunTimer(TimerCallback TimerProc, Int32 MillisecondsUntilDataRun)
    {
        Timer timer = new Timer(TimerProc, null, MillisecondsUntilDataRun, 1000);
    }

}

И мои ошибки:

Аргумент 1: невозможно преобразовать из 'void' в 'System.Threading.TimerCallback' DataOperations

Перегрузка для метода 'MainDataRunProcedure' принимает 0 аргументов

Наилучшее перегруженное соответствие метода для 'DataOperations.DataRunTimer.DataRunTimer (System.Threading.TimerCallback, int)' имеет недопустимые аргументы

Будем рады любым предложениям.Спасибо ...

1 Ответ

1 голос
/ 09 августа 2011

Ошибка компилятора довольно очевидна: MainDataRunProcedure возвращает void, но вы пытаетесь использовать его возвращаемое значение для вызова конструктора DataRunTimer.

Если выпытаясь передать сам метод (в данном случае MainDataRunProcedure), затем удалить скобки, то есть:

new DataRunTimer(MainDataRunProcedure, GetMillisecondsUntilDataRun());

Если пропустить скобки, этот метод передается как делегат.Если вы поставите скобки, то на самом деле вы пытаетесь вызвать метод (в данном случае без параметров).

Кроме того, методы abstract static являются недопустимыми и бессмысленными.

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