没有在树莓派单声道上发射的事件

时间:2015-07-12 02:53:02

标签: c# mono raspberry-pi raspbian sqldependency

我一直关注此帖子,用于开发查询通知客户端。 http://www.youdidwhatwithtsql.com/started-query-notifications-sql-server-2008-r2/1676/我在我的电脑上尝试了Visual Studio和mono上的这个代码,这些似乎解雇了onDependencyChange事件。然而,当我将它移动到带有单声道安装的覆盆子pi时,它似乎没有发射。我无法调试,因为pi在另一个位置,我正在使用SSH远程进入它。

static void Main(string[] args)
    {
        Console.WriteLine ("-----------------APPLICATION STARTED------------------");
        var connection = new SqlConnection(connectionString);
        SqlDependency.Start(connectionString);
        RefreshDataWithSqlDependency();

        Console.WriteLine ("Why is it here?");
        //blocks thread so you can read message
        Console.ReadLine();
        SqlDependency.Stop(connectionString);
    }

    static void RefreshDataWithSqlDependency()
    {
        //remove existing dependency if necessary
        if (dependency != null)
        {
            dependency.OnChange -= onDependencyChange;
            dependency = null;
        }

        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();

            SqlCommand command = new SqlCommand("SELECT ipAddress FROM dbo.dbDevices", connection);

            //Create a dependency and associate it with command
            dependency = new SqlDependency(command, null, 1);

            //Subscribe to the SqlDependency event.
            dependency.OnChange += new OnChangeEventHandler(onDependencyChange);

            //Start dependency listener
            SqlDependency.Start(connectionString);

            //execute command and refresh data
            RefreshData(command);
        }
    }

    private static void onDependencyChange(Object o, SqlNotificationEventArgs args)
    {
        Console.WriteLine("ondep gets hit");
        if ((args.Source.ToString() == "Data") || (args.Source.ToString() == "Timeout"))
        {
            Console.WriteLine("Refreshing data due to {0}", args.Source);
            RefreshDataWithSqlDependency();

        }
        else
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("Data not refreshed due to unexpected SqlNotificationEventArgs: Source={0}, Info={1}, Type={2}", args.Source, args.Info, args.Type.ToString());
            Console.ForegroundColor = ConsoleColor.Gray;
        }
    }

    private static void RefreshData(SqlCommand command)
    {
        using (var reader = command.ExecuteReader())
        {
            Console.Clear();
            while (reader.Read())
            {
                Console.WriteLine("ip = {0}", reader[0]);
            }
        }
    }

我现在在RefreshDataWithSqlDependency方法下放了一个额外的Console.WriteLine,当我使用Run>运行> Microsoft .NET或Mono 4.0.2似乎直接跳出了RefreshDataWithSqlDependency,但是当我使用调试器运行时,它就像应该的那样。它将解雇事件。

1 个答案:

答案 0 :(得分:0)

远程调试将成为SSH隧道的一种方式。

在Ras-pi方面,启动你的应用程序:

mono \
 --debug \
 --debugger-agent=transport=dt_socket,address=0.0.0.0:10000,suspend=y,server=y,keepalive=250 \
foodata.exe

(是的,0.0.0.0的地址是正确的)

在PC端,设置一个环境变量以启用Xamarian Studio / MonoDevelop的隐藏调试功能,并从该cmd行启动IDE。

在Linux上:

export MONODEVELOP_SDB_TEST=1 
monodevelop

在OS-X上(使用Xam Studio,如果您拥有的话,请更改cmd以使用MonoDevelop:

export MONODEVELOP_SDB_TEST=1 
/Applications/Xamarin\ Studio.app/Contents/MacOS/XamarinStudio

在Windows上(更新路径以匹配您的安装位置):

set MONODEVELOP_SDB_TEST=1 
<path>\XamarinStudio.exe

IDE启动后,加载正在调试的解决方案/项目,设置断点,然后选择以下菜单项:

Run / Run With / Custom Command Soft Mono Debugger 

注意:如果您没有设置env var并从cmd行运行它,那么该选项将不存在。

在出现的启动软调试器窗口中:

Command : ssh YourRaspiLogin@RasPiPassword -L 10000:127.0.0.1:10000 
Arguments : <leave empty>
IP : YourRasPiHostNameOrIPAddress
Port: : 10000

点击&#34;连接&#34;。

ssh窗口将打开,只需将其打开(最小化..),即你的反向隧道。如果您正在使用其他ssh客户端;腻子等。改变“ssh&#39;在命令字段中匹配您的设置。

您应该立即进行调试并假设您设置了一个断点,IDE应该在该行上停止等待您;-)