Tag: multithreading

没有锁的Threadsafe集合

我正准备接受采访,我遇到了这个问题。 我试过,但我找不到任何可以创建包含线程安全集合而没有“锁定”的类。 如果知道任何解决方案,请帮助。 创建一个派生自Object的C#类,并实现以下方法: AddString – 此方法应将给定字符串添加到内部集合 ToString – 重写此方法并返回包含内部集合中所有字符串的单个逗号分隔字符串 要求: 必须是线程安全的 必须支持多个并发读者 不得使用任何预先存在的线程安全集合 额外奖励:不要使用任何类型的锁

.NET的multithreading与多处理:糟糕的Parallel.ForEach性能

我编写了一个非常简单的“字数统计”程序,它读取文件并计算文件中每个单词的出现次数。 以下是代码的一部分: class Alaki { private static List input = new List(); private static void exec(int threadcount) { ParallelOptions options = new ParallelOptions(); options.MaxDegreeOfParallelism = threadcount; Parallel.ForEach(Partitioner.Create(0, input.Count),options, (range) => { var dic = new Dictionary<string, List>(); for (int i = range.Item1; i < range.Item2; i++) { //make some delay! //for (int x = 0; […]

定期运行的Windows服务

我正在编写一个Windows服务,一旦启动就会每X小时运行一次。 它完成的过程相当密集,所以我想使用后台工作程序。 我正在使用设置文件来存储运行和上次运行服务之间的小时数。 我不确定最好的方法 – 也就是说,我希望服务尽可能少地使用资源,当它运行时,它需要在后台工作程序中运行,报告它做了什么,然后回到空闲模式。 我考虑过使用2名背景工作者。 第一个worker将是服务的私有局部变量,运行如下: while (true) { //create new background worker and run Thread.Sleep(Settings.Default.SleepTimeHours * 3600000); } 使用在循环的每次迭代中创建的子工作程序,并在完成时销毁。 为了支持取消,我想我必须在服务中有第二个工作者的本地实例,但如果当前进程没有运行它将为null。 当辅助工作程序完成时,它将发送我的报告,在设置文件中设置最后一次运行时间,然后处理该工作程序并将引用设置为null。 我想知道是否有更好的方法来做这个或最好的做法。 谢谢

套接字编程多个客户端一台服务器

我刚刚开始使用C#进行套接字编程,现在我对这个问题感到有些困惑。 如何在不为每个客户端创建线程的情况下在单个服务器上处理多个客户端? 当有10个客户端时,每个客户端的一个线程工作正常,但如果客户端数量达到1000个客户端,则为每个客户端创建一个线程是否可取? 如果有任何其他方法可以这样做,有人请给我打电话?

Thread.VolatileRead()vs Volatile.Read()

在大多数情况下,我们被告知更喜欢Volatile.Read而不是Thread.VolatileRead ,因为后者发出全栅栏,而前者只发射相关的半栅栏(例如获取栅栏); 哪个更有效率。 但是,根据我的理解, Thread.VolatileRead实际上提供了Volatile.Read没有的东西,因为Thread.VolatileRead的实现: public static int VolatileRead(ref int address) { int num = address; Thread.MemoryBarrier(); return num; } 由于实现的第二行存在完整的内存障碍,我相信VolatileRead实际上确保将读取最后写入address的值。 根据维基百科的说法, “完整的围栏确保围栏之前的所有装载和存储操作都将在围栏之后发出的任何装载和存储之前提交。” 。 我的理解是否正确? 因此, Thread.VolatileRead仍然提供Volatile.Read不提供的东西?

在C#中的循环中使用lock语句

让我们尝试使用示例类SomeThread,我们试图阻止在Running属性设置为false之后调用DoSomething方法,并且由OtherThread类调用Dispose,因为如果在Dispose方法之后调用它们,则世界将以我们结束为止知道。 由于循环,感觉有可能发生邪恶的事情。 在启动下一个循环并且在调用DoSomething方法之前执行锁定之前,可以将Running更改为false,并在它到达锁之前调用Disposed。 在这种情况下,生活不会很好。 当我在一个简单易于维护的方法中使用循环时,我正在研究如何处理这个问题。 为了记录,我确实考虑过Double Lock Check图案,但它似乎并不适合C#。 警告:这是一个简化的示例,旨在让您轻松关注循环和锁定问题。 如果我没有详细说明某些地方请告诉我,我会尽我所能填写任何细节。 public class SomeThread : IDisposable { private object locker = new object(); private bool running = false; public bool Running { get { lock(locker) { return running; } } set { lock(locker) { running = value; } } } public void Run() { while (Running) […]

从另一个线程中捕获exception

我有一个在单独的线程中运行的方法。 该线程是从Windows应用程序中的表单创建和启动的。 如果从线程内部抛出exception,将其传递回主应用程序的最佳方法是什么。 现在,我将对主窗体的引用传递给线程,然后从线程调用该方法,并使该方法被主应用程序线程调用。 是否有最好的练习方法,因为我现在对自己的表现不满意。 我的表格示例: public class frmMyForm : System.Windows.Forms.Form { /// /// Create a thread /// /// /// private void btnTest_Click(object sender, EventArgs e) { try { //Create and start the thread ThreadExample pThreadExample = new ThreadExample(this); pThreadExample.Start(); } catch (Exception ex) { MessageBox.Show(ex.Message, Application.ProductName); } } /// /// Called from inside the […]

c#使用后台线程调用的线程问题

我有线程,它处理一些分析工作。 private static void ThreadProc(object obj) { var grid = (DataGridView)obj; foreach (DataGridViewRow row in grid.Rows) { if (Parser.GetPreparationByClientNameForSynonims(row.Cells[“Prep”].Value.ToString()) != null) UpdateGridSafe(grid,row.Index,1); Thread.Sleep(10); } } 我想安全地更新我的gridView循环,所以我使用经典的方式: private delegate void UpdateGridDelegate(DataGridView grid, int rowIdx, int type); public static void UpdateGridSafe(DataGridView grid, int rowIdx, int type) { if (grid.InvokeRequired) { grid.Invoke(new UpdateGridDelegate(UpdateGridSafe), new object[] { grid, rowIdx, […]

multithreading控制台应用程序什么时候退出?

class Program { public static void Main(String[] args) { var c = new C(); var thread = new Thread(new ThreadStart(cF)); thread.Start(); Console.WriteLine(“Exiting main, but the program won’t quit yet…”); } } class C { public void F() { for (int i = 0; i < 10; i++) { Console.WriteLine("Waiting {0}", i); Thread.Sleep(1000); } Console.WriteLine("Now the […]

在不等待的情况下调用异步方法

我试图在不等待结果的情况下调用异步方法(在ASP.NET Web API 2应用程序中)。 我的意思是我想要主线程继续执行并且不等待被调用的方法来完成。 我正在尝试这个片段: // The async method: private static async Task LogAsync(Exception exception, string ip, MethodBase method, object parameters) { // some stuff } // The caller methods: public static void Log1(Exception exception, object parameters) { LogAsync(exception, ip, method, parameters); } public static void Log2(Exception exception, object parameters) { Task.Factory.StartNew(() => LogAsync(exception, […]