小编Pre*_*k K的帖子

跨线程操作无效:从创建它的线程以外的线程访问控件

我有一个场景.(Windows Forms,C#,.NET)

  1. 有一个主要表单托管一些用户控件.
  2. 用户控件执行一些繁重的数据操作,这样如果我直接调用了 UserControl_Load方法,则UI在加载方法执行的持续时间内变得无响应.
  3. 为了克服这个问题,我在不同的线程上加载数据(尝试尽可能少地更改现有代码)
  4. 我使用了后台工作线程来加载数据,完成后会通知应用程序已经完成了它的工作.
  5. 现在来了一个真正的问题.所有UI(主窗体及其子用户控件)都是在主要主线程上创建的.在usercontrol的LOAD方法中,我基于userControl上的某些控件(如文本框)的值来获取数据.

伪代码看起来像这样:

代码1

UserContrl1_LoadDataMethod()
{
    if (textbox1.text == "MyName") // This gives exception
    {
        //Load data corresponding to "MyName".
        //Populate a globale variable List<string> which will be binded to grid at some later stage.
    }
}
Run Code Online (Sandbox Code Playgroud)

它给出的例外是

跨线程操作无效:从创建它的线程以外的线程访问控件.

为了更多地了解这一点,我做了一些谷歌搜索,并提出了一个建议,如使用下面的代码

代码2

UserContrl1_LoadDataMethod()
{
    if (InvokeRequired) // Line #1
    {
        this.Invoke(new MethodInvoker(UserContrl1_LoadDataMethod));
        return;
    }

    if (textbox1.text == "MyName") // Now it wont give an exception
    {
    //Load data correspondin to "MyName"
        //Populate a globale …
Run Code Online (Sandbox Code Playgroud)

c# multithreading invoke winforms

559
推荐指数
18
解决办法
39万
查看次数

"\n"和Environment.NewLine之间的区别

两者之间有什么区别(如果有的话)(相对于.Net)?

.net c# cross-platform

192
推荐指数
6
解决办法
30万
查看次数

自v1.3.0起,ng-change,ng-click不能与data-toggle ="buttons"一起使用

适用于角度版本1.3.4.在以下代码段中,ng-change事件不起作用.

依赖:Bootstrap版本3.3.0

以下代码适用于版本1.2.27

JavaScript的

var app = angular.module("demoApp", ['ngRoute']);

app.controller('DemoController', function ($scope) {
    init();
    function init() {
        $scope.newItemType = 'bill';
        $scope.change = function () {
            alert($scope.newItemType)
        };
    }
});

app.config(function ($routeProvider) {
    $routeProvider
        .when('/prerak/list', {
            controller: 'DemoController',
            templateUrl: '/app/views/demo.html'
        })
});
Run Code Online (Sandbox Code Playgroud)

HTML

<h4>Demo</h4>

<br />

<div>
    <div class="btn-group" data-toggle="buttons">
       <label class="btn btn-success"> 
         <input type="radio" value="bill" ng-change="change()" ng-model="newItemType"> Insert New Bill <span class="glyphicon glyphicon-file"></span> 
      </label> 
      <label class="btn btn-success">
        <input type="radio" value="coin" ng-change="change()" ng-model="newItemType"> Insert New Coin <span class="glyphicon glyphicon-adjust"></span>
      </label>
    </div> …
Run Code Online (Sandbox Code Playgroud)

twitter-bootstrap angularjs

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

lock(){}锁定资源,还是锁定一段代码?

我还是很困惑......当我们写下这样的东西时:

Object o = new Object();
var resource = new Dictionary<int , SomeclassReference>();
Run Code Online (Sandbox Code Playgroud)

...并且有两个代码块o在访问时锁定resource...

//Code one
lock(o)
{
  // read from resource    
}

//Code two
lock(o)
{
  // write to resource
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我有两个线程,一个线程执行代码读取resource和另一个写入它,我想要锁定resource,当它被读取时,编写器将不得不等待(反之亦然 - 如果它正在写到,读者必须等待).锁构造能帮助我吗?......或者我应该使用别的东西?

(我Dictionary用于此示例的目的,但可以是任何东西)

我特别关注两种情况:

  1. 两个线程试图执行相同的代码行
  2. 两个线程试图在同一资源上工作

lock在两个条件帮助?

c# concurrency multithreading

16
推荐指数
2
解决办法
4253
查看次数

C#中的可变范围混淆

我有两个代码示例.第一个不编译,但第二个编译.

代码示例1 (不编译)

public void MyMethod(){
    int i=10;

    for(int x=10; x<10; x++) {
        int i=10; // Point1: compiler reports error
        var objX = new MyOtherClass();
    }

    var objX = new OtherClassOfMine(); // Point2: compiler reports error
}
Run Code Online (Sandbox Code Playgroud)

我理解编译器报告错误的原因Point1.但我不明白为什么它报告错误Point2.如果你说这是因为MSIL中的组织,那为什么第二个代码示例会编译?

代码示例2 (编译)

public void MyMethod(){

    for(int x=10; x<10; x++) {
        int i=10; 
        var objX = new MyOtherClass();
    }

    for(int x=10; x<10; x++) {
        int i=10; 
        var objX = new MyOtherClass();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果变量范围的简单规则适用于代码示例2,那么为什么这些规则不适用于代码示例1?

c# scope

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

HTTP模块和OWIN中间件之间的区别

我浏览了http://www.asp.net/aspnet/overview/owin-and-katana/an-overview-of-project-katana,并想知道HTTP模块和owin中间件之间有什么区别.我能想到的一些指针是

1)Owin中间件将应用程序与主机/服务器分离.因此,我不再需要将我的应用程序逻辑专门挂钩到System.Web

2)Owin中间件按添加顺序执行(不确定HttpModules是否也适用;可能取决于我在web.config中添加它们的方式)

3)HttpModules帮助我附加特定于应用程序事件的代码.Owin中间件独立于这些事件

另请告诉我使用OWIN模块而不是HttpModule的实际示例.

我最终阅读的更多链接 (我将继续添加到这里,当我遇到新的) http://www.cloudidentity.com/blog/2013/07/23/securing-a-web-api-with- Windows的Azure的广告和武士刀/

更新:也许这有我正在寻找的答案 http://www.asp.net/aspnet/overview/owin-and-katana/owin-middleware-in-the-iis-integrated-pipeline

我什么时候应该使用OWIN Katana?

谢谢.

asp.net owin

15
推荐指数
1
解决办法
5940
查看次数

为什么我们不能在类级别声明var a = new List <string>?

我知道我们不能在课堂上这样做,但在方法层面,我们总能做到这一点.

var myList=new List<string> // or something else like this
Run Code Online (Sandbox Code Playgroud)

这个问题出现在我的脑海中,因为无论我们在哪里声明这样的变量.我们总是在表达式的RHS中提供类型信息.所以编译器不需要做类型猜测.(如果我错了,请纠正我).

所以问题仍然是为什么不在班级,而在方法层面允许

c#

5
推荐指数
2
解决办法
2971
查看次数

MVC-Routing,为什么我不能忽略默认值,匹配的路由不包含"控制器"路由值,这是必需的

我有这个配置

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
               name: "TestRoute",
               url: "home/MyTestDrillDown/{productcat}",
               defaults: new { controller = "Home", action = "MyTestDrillDown" }
           );

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
Run Code Online (Sandbox Code Playgroud)

我想将TestRoute配置为

routes.MapRoute(
               name: "TestRoute",
               url: "home/MyTestDrillDown/{productcat}"
           );
Run Code Online (Sandbox Code Playgroud)

但我看到以下错误. 匹配的路由不包含"控制器"路由值,这是必需的.

我的理解是,如果我有一个硬编码的url,那么它直接匹配一个控制器和一个动作,在我的情况下"home/MyTestDrillDown/{productcat}"匹配HomeControllerMyTestDrillDown动作.

我确信我缺少一些非常基本和重要的东西,因为存在一个MapRoute方法的重载,它只接受NameUrl作为参数.

谢谢

asp.net-mvc asp.net-mvc-routing

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

可能是BAD编码风格......请评论

我正在检查新名称是否已存在.

代码1

if(cmbxExistingGroups.Properties.Items.Cast<string>().ToList().Exists(txt => txt==txtNewGroup.Text.Trim())) {
        MessageBox.Show("already exists.", "Add new group");
      }
Run Code Online (Sandbox Code Playgroud)

否则我可以写:

代码2

foreach(var str in cmbxExistingGroups.Properties.Items)
      {
        if(str==txtNewGroup.Text) {
        MessageBox.Show("already exists.", "Add new group");        
            break;
        }   
      }
Run Code Online (Sandbox Code Playgroud)

我写了这两个,并认为我正在利用代码1中的语言功能.

......是的:他们都为我工作......我想知道表现: - /

c#

0
推荐指数
3
解决办法
678
查看次数