winforms app的轻量级仪器

时间:2008-11-17 05:06:29

标签: c# winforms instrumentation

我有一个winforms应用程序,我想跟踪每次用户点击某些按钮等以及其他操作。我最好的方法是跟踪这些信息,然后将它们放在一起,这样我就可以运行大多数使用过的功能等指标。

这是一个winforms应用程序,我在世界各地都有用户。

4 个答案:

答案 0 :(得分:2)

您的设计必须确保解决两个大问题

  1. 隐私(Don提到的内容) - 您必须清楚地知道您正在收集哪些信息并将其发送到您的中央服务器,理想情况下,用户应该能够检查您发送回中央的确切数据服务器(如果他们愿意) - 对于任何公共软件,应该有一种非常简单的方法可以选择退出。

  2. 性能和可伸缩性 - 您必须估计在服务器端真正需要多少数据,并查看聚合和压缩数据客户端的所有技巧(以及对数量的硬限制)您将发送的流量以及您发送的频率)

  3. 关于客户端实现,我建议调查Sqlite.net或其他嵌入式数据库。使用嵌入式数据库在客户端上存储此信息将为您提供大量的聚合灵活性,并具有事务性,快速且易于实现的优势。 Sqlite拥有非常慷慨的公共域名许可证,因此从法律角度来看,它在公共应用程序中非常容易使用。

答案 1 :(得分:1)

尝试进行谷歌搜索。 Ben Liblit及其合着者提出了一些有趣的想法,Alex Orso及其合着者的另一系列想法(免责声明 - 我是Alex Orso的合着者之一)基于从每个用户那里获取运行时信息的样本,并以有趣的方式将它们组合在一起。

http://theory.stanford.edu/~aiken/publications/papers/pldi03b.pdf

http://www.cs.umd.edu/class/fall2006/cmsc838p/Ramss/remoteClassJournal.pdf

是这类论文/想法的两个(不一定是最好的)例子。

答案 2 :(得分:0)

我会尝试这样的事情:

    // execute this method once all forms have been created
    public static void HookButtons()
    {
         foreach( Form f in Application.OpenForms )
         {
              EnumerateControls( f.Controls );
         }
    }

    public static void EnumerateControls( ICollection controls )
    {
        foreach( Control ctrl in controls )
        {
            if( ctrl.Controls.Count > 0 )
            {
                EnumerateControls( ctrl.Controls );
            }

            if( ctrl is ButtonBase )
            {
                ctrl.MouseClick +=new MouseEventHandler( ctrl_MouseClick );
            }
        }

    }

    static void ctrl_MouseClick( object sender, MouseEventArgs e )
    {
        ButtonBase clicked = ((ButtonBase)sender);

        // do something with the click information here
    }

答案 3 :(得分:0)

小心你如何处理这个问题。一些公司因收集太多信息或不清楚收集的信息而引起用户反对。最安全的方法是在启用任何“手机主页”功能之前询问用户。允许用户在发送之前查看实际数据似乎也很好。

我想知道是否有一些方法可以捎带一键式部署调用,只要一键启动应用程序启动并检查更新。不过,我还没有调查过。

至于收集实际数字,也许用户设置是最简单的地方。如果您不熟悉它们,只需查看项目属性并转到“设置”选项卡。