小编Pre*_*zel的帖子

如何在多线程应用程序中安全地填充数据和Refresh()DataGridView?

我的应用程序有一个DataGridView对象和一个MousePos类型的List.MousePos是一个自定义类,它包含鼠标X,Y坐标("Point"类型)和此位置的运行计数.我有一个线程(System.Timers.Timer)每秒引发一次事件,检查鼠标位置,添加和/或更新此列表上鼠标位置的计数.

我想有一个类似的运行线程(再次,我认为System.Timers.Timer是一个不错的选择),这将再次引发一次事件一次自动Refresh()DataGridView,以便用户可以看到数据屏幕更新.(就像TaskManager一样.)

不幸的是,调用DataGridView.Refresh()方法会导致VS2005停止执行,并注意到我遇到了跨线程的情况.

如果我理解正确,我现在有3个主题:

  • 主UI线程
  • MousePos List线程(Timer)
  • DataGridView刷新线程(计时器)

为了看看我是否可以在主线程上刷新()DataGridView,我在表单中添加了一个名为DataGridView.Refresh()的按钮,但是这个(奇怪地)没有做任何事情.我发现了一个似乎表明如果我设置DataGridView.DataSource = null并返回到我的List的主题,它会刷新数据网格.确实这有效,但只能通过按钮(在主线程上处理).


所以这个问题变成了两个问题:

  1. 将DataGridView.DataSource设置为null并返回到我的List是一种可接受的刷新数据网格的方法吗?(对我来说似乎效率低下......)
  2. 如何在多线程环境中安全地执行此操作?

这是我到目前为止编写的代码(C#/.Net 2.0)

public partial class Form1 : Form
{
    private static List<MousePos> mousePositionList = new List<MousePos>();
    private static System.Timers.Timer mouseCheck = new System.Timers.Timer(1000);
    private static System.Timers.Timer refreshWindow = new System.Timers.Timer(1000);

    public Form1()
    {
        InitializeComponent();
        mousePositionList.Add(new MousePos());  // ANSWER! Must have at least 1 entry before binding to DataSource
        dataGridView1.DataSource = mousePositionList;
        mouseCheck.Elapsed += new System.Timers.ElapsedEventHandler(mouseCheck_Elapsed);
        mouseCheck.Start();
        refreshWindow.Elapsed += new System.Timers.ElapsedEventHandler(refreshWindow_Elapsed);
        refreshWindow.Start();
    }

    public void mouseCheck_Elapsed(object source, …
Run Code Online (Sandbox Code Playgroud)

.net c# multithreading delegates datagridview

4
推荐指数
2
解决办法
2万
查看次数

一个简单的状态机,使用C#中的Static类通过事件通知其他订阅者

我一直在尝试为我的应用程序编写一个简单的静态类状态机,以便在系统状态发生变化时通知其他控件和代码.我想我几乎拥有它,但我遇到了一个小问题,我不知道如何解决.

这是代码:

// An enum denoting the 3 States
public enum Status { Error = -1, Working, Ready }

// The main state change class
public static class Sys
{
    // system status
    private static Status state;

    // delegate and event
    public static delegate void StateChangeHandler(object sys, SysInfoEventArgs sysStateInfo);
    public static event StateChangeHandler OnStateChange;

    public static Status State
    {
        get { return state; }
        set
        {
            SysInfoEventArgs sysInfo = new SysInfoEventArgs(state, value);
            state = value;
            OnStateChange(this, sysInfo);
        }
    }
} …
Run Code Online (Sandbox Code Playgroud)

c# events static class state-machine

4
推荐指数
2
解决办法
1784
查看次数

在c#中解析一个字符串

假设有一个xml文件,如下所示:

<Instances>
  <Bits = "16" XCoord = "64" YCoord = "64" ZCoord = "64" FileType="jpeg" Location="C:\Series1\Image1.jpg" ImageNumber = "1"/>
  <Bits = "16" XCoord = "64" YCoord = "64" ZCoord = "64" FileType="jpeg" Location="C:\Series1\Image2.jpg" ImageNumber = "2"/>
  <Bits = "16" XCoord = "64" YCoord = "64" ZCoord = "64" FileType="jpeg" Location="C:\Series1\Image3.jpg" ImageNumber = "3"/>
  <Bits = "16" XCoord = "64" YCoord = "64" ZCoord = "64" FileType="jpeg" Location="C:\Series1\Image4.jpg" ImageNumber = "4"/>
  <Bits = "16" XCoord = "64" YCoord = "64" ZCoord …
Run Code Online (Sandbox Code Playgroud)

c# xml string linq-to-xml

4
推荐指数
2
解决办法
593
查看次数

可以为ASP.NET的Html.ActionLink()方法编写扩展方法吗?

现在,我正在尝试解决一个IE6/7错误,该错误要求</a>使用此特定于IE的注释包含结束标记,以使某些下拉菜单工作:

<!--[if IE 7]><!--></a><!--<![endif]-->
Run Code Online (Sandbox Code Playgroud)

不幸的是,我无法将此直接注入到我的View页面代码中,如下所示:

<%= Html.ActionLink("LinkName<!--[if IE 7]><!--></a><!--<![endif]-->","Action","Controller") %>
Run Code Online (Sandbox Code Playgroud)

由于Html.ActionLink将做安全的事情并过滤掉注释以防止Javascript注入攻击.好的.我很好.好的设计决定.

我想要做的就是为此编写一个扩展方法,但是这个过程正在躲避我,因为我之前没有这样做过.

我认为这样可行,但是Intellisense似乎没有采用我编写的这种扩展方法.

public static class MyLinkExtensions
{
    public static string ActionLinkIE(this HtmlHelper htmlHelper,  
        string linkText, string actionName, string controllerName)
    {
        return LinkExtensions.ActionLink(htmlHelper, linkText, actionName, controllerName).
            Replace(@"</a>", @"<!--[if IE 7]><!--></a><!--<![endif]-->");
    }
}
Run Code Online (Sandbox Code Playgroud)

有什么建议?

编辑:班级名称是否重要?(就我而言,我称之为MyLinkExtensions)

此外,鼠标悬停在<%= Html.ActionLink() %>那里似乎已经是一个扩展方法.我可以扩展扩展方法吗?

asp.net-mvc extension-methods actionlink html.actionlink

3
推荐指数
1
解决办法
1702
查看次数

依赖注入(DI)依赖于接口吗?

对大多数人来说这似乎是显而易见的,但我只是想确认依赖注入(DI)依赖于接口的使用.

更具体地说,对于在其构造函数中具有某个接口作为参数的类或者定义为属性(也称为Setter)的某个接口的情况,DI框架可以移交具体类的实例以满足需要该类中的接口.(如果这个描述不清楚,请道歉.我无法正确描述这一点,因为术语/概念对我来说仍然有点新鲜.)

我问的原因是我目前有一个具有各种依赖性的类.不是对象依赖,而是URL.这个类看起来像这个[C#]:

using System.Web.Services.Protocols;
public partial class SomeLibraryService : SoapHttpClientProtocol 
{
        public SomeLibraryService() 
        {
            this.Url = "http://MyDomainName.com:8080/library-service/jse";
        }
}
Run Code Online (Sandbox Code Playgroud)

SoapHttpClientProtocol类有一个名为的Public属性Url(它是一个普通的旧"字符串"),这里的构造函数将其初始化为硬编码值.

我可以使用DI框架在构造中注入不同的值吗?我想的不是因为this.Url不是任何一种Interface; 这是一个String.

[顺便提一下,根据我正在使用的代码中的注释,上面的代码是"由wsdl自动生成的".所以我并不特别想改变这段代码,尽管我也没有看到自己重新生成它.所以可能更改此代码很好.]

我可以看到自己制作了一个替代构造函数,它将一个字符串作为参数并以this.Url这种方式初始化,但我不确定这是关于保持松散耦合的关注点分离的正确方法.(SoC)的

对这种情况有什么建议吗?

c# dependency-injection separation-of-concerns

3
推荐指数
2
解决办法
499
查看次数

自动属性:在"设置"期间检查/验证

我想我们都同意C#3.0中的自动属性很棒.像这样的东西:

private string name;
public string Name
{
    get { return name; }
    set { name = value; }
}
Run Code Online (Sandbox Code Playgroud)

减少到这个:

public string Name { get; set; }
Run Code Online (Sandbox Code Playgroud)

可爱!

但是,如果我想在"设置"时使用ToUpperInvariant()方法转换Name字符串,我应该怎么做.我是否需要恢复旧的C#2.0创建属性的风格?

    private string name;
    public string Name
    {
        get { return name; }
        set { name = value.ToUpperInvariant(); }
    }
Run Code Online (Sandbox Code Playgroud)

或者有更优雅的方式来实现这一目标吗?

setter automatic-properties c#-3.0

3
推荐指数
1
解决办法
893
查看次数

什么归来?错误字符串,错误字符串输出的Bool或具有异常的空字符

我将大部分时间都花在C#上,并试图找出处理异常的最佳实践,并将调用方法中的错误消息干净地返回给调用方法.

例如,这是一些ActiveDirectory身份验证代码.请将此方法想象为类的一部分(而不仅仅是一个独立的函数.)

bool IsUserAuthenticated(string domain, string user, string pass, out errStr)
{
  bool authentic = false;
  try
  {
    // Instantiate Directory Entry object
    DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain, user, pass);

    // Force connection over network to authenticate
    object nativeObject = entry.NativeObject;

    // No exception thrown? We must be good, then.
    authentic = true;
  }
  catch (Exception e) { errStr = e.Message().ToString(); }
  return authentic;
}
Run Code Online (Sandbox Code Playgroud)

这样做的好处是明确的YES或NO,您可以将其嵌入到If-Then-Else语句中.缺点是它还需要使用该方法的人提供字符串以获取错误(如果有的话).

我想我可以使用相同的参数减去"out errStr"来重载此方法,但忽略错误似乎是一个坏主意,因为这样的失败可能有很多原因......

或者,我可以编写一个返回错误字符串的方法(而不是使用"out errStr"),其中返回的空字符串表示用户认证正常.

string AuthenticateUser(string domain, string user, string …
Run Code Online (Sandbox Code Playgroud)

exception-handling return exception return-value

2
推荐指数
1
解决办法
2236
查看次数

MenuItemCollection与List <MenuItem>

最近我用一个Lambda表达式编写了一段C#代码:

var dynMenu = new List<MenuItem>();
// some code to add menu items to dynMenu
if (!dynMenu.Any(x => x.Text == controller))
{ 
    // do something
}
Run Code Online (Sandbox Code Playgroud)

通过我的代码,我发现每个MenuItem本身都有一个名为ChildItems的属性,它恰好是MenuItemCollection类型.好奇,我想我会用这个MenuItemCollection替换我的MenuItem列表.

将第一行更改为:

var dynMenu = new MenuItemCollection();
Run Code Online (Sandbox Code Playgroud)

我注意到这个MenuItemCollection类型没有扩展方法,如"Any <>","All <>","First <>"等等 - 我觉得很奇怪.

有没有办法在这里使用Lambda表达式?

我应该回到使用"List <<\MenuItem>"吗?

c# lambda extension-methods menuitem

2
推荐指数
1
解决办法
1657
查看次数