小编Bri*_*eon的帖子

我可以使用parallel.ForEach来调用不同的函数吗?

我有一个运行的foreach循环.我正在研究并行功能.是否可以转换以下代码以使用并行编程?

int result ;
int counter;
foreach(DataRow dr in ds.Tables[0].Rows) {
    switch(dr["Gender"].ToString()) {
        case "Male":
            result = functionMale(dr["Gender"].ToString());
            counter += result;
            break;
        case "Female":
            result = functionFemale(dr["Gender"].ToString());
            counter += result;
            break;
        default:
            result = functionUnkown(dr["Gender"].ToString());
            counter += result;
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

根据我的观察,我到目前为止只有以下内容.

Parallel.ForEach(ds.Tables[0].AsEnumerable(), dr => {
    var result = functionMale(dr["Gender"].ToString();
});
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?谢谢

.net c# asp.net parallel-processing multithreading

4
推荐指数
1
解决办法
1695
查看次数

锁定/并发问题

我有以下C#代码:

1.    List<BandEdge> bandEdgeList;
2.    
3.    bandEdgeList = CicApplication.BandEdgeCache.Where(row => row.Coater == coater).ToList();
4.    foreach (BandEdge bandEdge in bandEdgeList)
5.       {
6.          ...
7.          ...
8.       }
Run Code Online (Sandbox Code Playgroud)

我的问题是这个.一旦'bandEdgeList'填充在第3行,如果另一个线程修改了CicApplication.BandEdgeCache的内容,'bandEdgeList'的内容是否会失效?我在CicApplication.BandEdgeCache getter/setter中有一个锁.但是我想知道是否应该锁定这段代码,以便在我使用'bandEdgeList'时CicApplication.BandEdgeCache的内容不会改变.

c# concurrency multithreading locking

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

你在哪里放收藏班?

我不确定是否已经存在这样的术语,但是为了这个问题,我们定义两个术语:对等实现或嵌套实现来说明如何在包含许多父/子实体关系的数据模型中实现集合类.

我使用术语peer来描述你在模型层中实现集合类的场景,以及实体类本质上使它们在你的API中成为对等体,如下所示:

public class ParentEntity
{
  private ChildEntityCollection children;
}

public class ChildEntity
{
}

public class ChildEntityCollection : ICollection<ChildEntity>
{
}
Run Code Online (Sandbox Code Playgroud)

这里的主要优点是您可以在碰巧存储相同类型子级的其他实体类中重用该集合类.

我使用术语嵌套来描述你将它们实现为嵌套类的场景,如下所示:

public class ParentEntity
{
  private ChildEntityCollection children;

  public class ChildEntityCollection : ICollection<ChildEntity>
  {
  }
}

public class ChildEntity
{
}
Run Code Online (Sandbox Code Playgroud)

这里的主要优点是每个父级都可以实现自己的集合类,以最适合该特定父级的方式存储其子级.例如,一个父实体可能会发现一个数组数据结构运行良好而另一个可能使用一个splay树(我知道这个模糊不清,但它很好地说明了我的观点).

我注意到Microsoft在各种.NET相关框架中使用了这两种习惯用法.System.Windows.Forms命名空间似乎很大程度上依赖于嵌套实现.我倾向于发现自己也喜欢这种方法,即使它需要更多的工作.

建议,评论,替代想法?

c# collections nested-class

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

c#如何从我的班级访问我的表单控件?

我在与表单相同的命名空间中有一个类.我可以从我的班级访问表单控件的方法/属性吗?我怎么能做到这一点?

.net c#

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

什么是现代C#方式启动两个线程然后等待它们结束?

你会如何使用C#中最新的线程技术重写它?

var dateRange = new DateRange(date, date.AddDays(1));
var extracter = new ConversionsExtracter(dateRange, AdvertiserId);
var loader = new ConversionsLoader();
var extracterThread = extracter.Start();
var loaderThread = loader.Start(extracter);
extracterThread.Join();
loaderThread.Join();
Run Code Online (Sandbox Code Playgroud)

loader和extract对象都有一个Start方法:

public  Thread Start()
{
    var thread = new Thread(Extract);
    thread.Start();
    return thread;
}
Run Code Online (Sandbox Code Playgroud)

c# multithreading

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

为什么即使使用Monitor,所有成员变量也不需要易变的线程安全性?(为什么模型真的有效?)

(我知道他们没有,但我正在寻找其实际工作的根本原因,而不使用volatile,因为没有什么可以防止编译器将变量存储在没有volatile的寄存器中......或者是......)

这个问题源于思想的不和谐,即没有易失性的编译器(理论上可以通过各种方式优化任何变量,包括将其存储在CPU寄存器中.)虽然文档说在使用锁定变量等同步时不需要.但实际上在某些情况下,编译器/ jit似乎无法知道您是否会在代码路径中使用它们.所以怀疑是在这里真正发生的事情,使记忆模型"工作".

在这个例子中,什么阻止编译器/ jit优化_count到一个寄存器,从而在寄存器上完成增量而不是直接到存储器(稍后在退出调用后写入内存)?如果_count是易变的,那么看起来一切都应该没问题,但很多代码都是在没有volatile的情况下编写的.如果在方法中看到锁定或同步对象,编译器可能知道不会将_count优化到寄存器中,但在这种情况下,锁定调用是在另一个函数中.

大多数文档都说如果使用锁等同步调用,则不需要使用volatile.

那么是什么阻止了编译器优化_count到寄存器并可能只更新锁中的寄存器?我有一种感觉,大多数成员变量都不会因为这个原因被优化到寄存器中,因为每个成员变量都需要是易变的,除非编译器告诉它不应该优化(否则我怀疑大量的代码会失败) .我看到类似的东西,看看C++多年前本地函数变量存储在寄存器中,类成员变量没有.

所以主要的问题是,它是否真的是没有volatile的唯一方法,编译器/ jit不会将类成员变量放在寄存器中,因此不需要volatile?

(请忽略调用中缺少异常处理和安全性,但你得到了要点.)

public class MyClass
{
  object _o=new object();

  int _count=0;

  public void Increment()
  {
    Enter();
    // ... many usages of count here...
    count++;
    Exit();
  }




//lets pretend these functions are too big to inline and even call other methods 
// that actually make the monitor call (for example a base class that implemented these) 
  private void Enter() { Monitor.Enter(_o); }  
  private void Exit()  { Monitor.Exit(_o); }  //lets pretend this function …
Run Code Online (Sandbox Code Playgroud)

c# multithreading volatile memory-barriers

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

快速停止

我有这个代码:

private STOP = false;

public void Start()
{
     while(!STOP)
     {
          //do some work
          Thread.Sleep(15000);
     }
}

public void Stop()
{
     STOP = true;
}
Run Code Online (Sandbox Code Playgroud)

但使用此代码有时需要等待15秒,如何快速停止此循环或者可能需要使用其他代码?

谢谢!

c# multithreading while-loop

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

C#Windows Forms Threading:我的表单似乎不是作为自己的线程运行

我有一个Windows窗体.单击"确定"时,将完成一些工作,这需要一些时间.在此过程中,窗体的所有控件都被禁用,因此用户无法执行某些操作.除了一个按钮,中止.此按钮仍可用于中止过程任务.我开始一个新线程,很好.问题是当单击ob abort时,在线程结束后调用该事件.

下面是代码来启动线程(在我的buttonOk_Click Eventmethod中)(我正在使用优先级来假装在我做一些数据库操作时中止线程):

t1 = new System.Threading.Thread(processing);
t1.Priority = System.Threading.ThreadPriority.Normal;
t1.Start();
Run Code Online (Sandbox Code Playgroud)

下面是我捕获中止事件的代码,但是在线程工作期间没有访问它.(使用ButtonAbort_Click-Method)

while (t1.Priority == System.Threading.ThreadPriority.Highest)
{
    System.Threading.Thread.Sleep(1000);
}
try
{
    lock (t1)
    {
        if (t1.ThreadState != System.Threading.ThreadState.Aborted)
        {
            //abort Thread
            t1.Abort();
            //wait that lock is not released to early
            while (t1.ThreadState != System.Threading.ThreadState.Aborted) { }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

希望您能够帮助我.谢谢.

c# multithreading winforms

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

方法不起作用

在我的主要表单中,我运行这个:

this.disableForm();
btnAbort.Enabled = true;
Run Code Online (Sandbox Code Playgroud)

disableForm是我的程序中Form的扩展方法,定义如下:

public static void disableForm(this Form f)
{
    foreach (Control c in f.Controls)
    {
        f.Enabled = false;
    }

    f.Cursor = Cursors.WaitCursor;
}
Run Code Online (Sandbox Code Playgroud)

问题是下一个命令btnAbort.Enabled = true;没有做任何事情.

如果我将代码直接放在方法中而不是调用,它就可以工作disableForm().为什么会这样?它与线程有关吗?

c# winforms

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

只有第一次出现

我有这个字符串MIL_A_OP=LI_AND=SSB12=JL45==DO=90==IT=KR002112 ,我需要将它拆分为2,基于第一个"="

所以我需要它得到:

第一个字符串 MIL_A_OP

第二串: LI_AND=SSB12=JL45==DO=90==IT

这下面的代码是我的,但它给了我MIL_A_OP和LI_AND,我想念其余的

try
{
    StreamReader file1 = new StreamReader(args[0]);
    string line1;
    while ((line1 = file1.ReadLine()) != null)
    {
        if (line1 != null && line1.Trim().Length > 0)//if line is not empty
        {
            int position_1 = line1.IndexOf('=');
            string s_position_1 = line1.Substring(position_1, 1);
            char[] c_position_1 = s_position_1.ToCharArray(0,1);
            string[] line_split1 = line1.Split(c_position_1[0]);
            Foo.f1.Add(line_split1[0], line_split1[1]);
        }
    }
    file1.Close();
}
catch (Exception e)
{
    Console.WriteLine("File " + args[0] + " could not be read");
    Console.WriteLine(e.Message);
}
Run Code Online (Sandbox Code Playgroud)

.net c# string split

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

内部如何工作?

Thread t = new Thread (WriteY);
t.Start();            
for (int i = 0; i < 1000; i++) Console.Write ("x");

static void WriteY()
{
    for (int i = 0; i < 1000; i++) Console.Write ("y");
} 
Run Code Online (Sandbox Code Playgroud)

内部线程如何工作?意味着为什么每次运行时上述代码的输出都没有修复,'x'和'y'的顺序是不同的?

c# multithreading

0
推荐指数
1
解决办法
1250
查看次数

第一次多线程

我试图第一次使用线程,并想出了这个:

Thread myThread  = new Thread(() =>
  {
    test = Class1.getNumbers(param1, param 2);
    MessageBox.Show(test.toString());
  });
Run Code Online (Sandbox Code Playgroud)

但这对我没有任何帮助.我做错了什么?

c# multithreading winforms

0
推荐指数
1
解决办法
132
查看次数