【问题标题】:Could use a hand with my timer wrapper class, would be great可以使用我的计时器包装类,会很棒
【发布时间】:2011-08-09 06:25:27
【问题描述】:

我至少在这个问题上缩小了我的错误,但我现在只是卡住了。我在那个“它似乎应该工作”并且我只重新查找相同的帖子。所以。我正在使用一个抽象基类,我想用它来控制数据下载过程。在这个类中,我添加了一个我为 System.Threading.Timer 编写的包装器的实例。在我的计时器的构造函数中,我有两个参数,一个是尝试将抽象方法传递给回调对象,另一个是计时器的滴答事件的时间,基于具体/派生类中的实例变量不同的数据下载过程。

这是我的代码:

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)' 的最佳重载方法匹配有一些无效参数

期待任何建议。谢谢...

【问题讨论】:

    标签: c# delegates timer


    【解决方案1】:

    编译器错误是不言自明的:MainDataRunProcedure 返回 void,但您试图使用其返回值来调用 DataRunTimer 构造函数。

    如果您尝试传递方法本身(在本例中为 MainDataRunProcedure),则删除括号,即:

    new DataRunTimer(MainDataRunProcedure, GetMillisecondsUntilDataRun());
    

    省略括号会将该方法作为委托传递。如果你放括号,那么你实际上是在尝试 invoke 方法(在这种情况下没有参数)。

    另外,abstract static 方法既非法又毫无意义。

    【讨论】:

    • 谢谢艾蒂安。我看到我正在这样做,这是一个公认的粗略尝试。但是你明白我在做什么吗?将 ref 传递给方法......所以这是我相信的回调对象。你这里有一个没有代表经验的菜鸟 :) 有人吗?
    猜你喜欢
    • 2017-10-15
    • 2022-11-10
    • 1970-01-01
    • 2013-07-26
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    相关资源
    最近更新 更多