草庐IT

running_thread_count

全部标签

c# - Async/Await VS Task.Run : When to use ? 如何使用?

好吧,我希望我掌握了async/await的基础知识,但仍有一些问题在我脑海中挥之不去。但是现在我说的就是这个问题了。假设在这个简单的例子中staticvoidMain(string[]args){Method();Console.WriteLine("MainThread");Console.ReadLine();}publicasyncstaticvoidMethod(){awaitTask.Run(newAction(LongTask));Console.WriteLine("NewThread");}publicstaticvoidLongTask(){Thread.Sleep

c# - 为什么 Thread 不实现 IDisposable?

我注意到System.Threading.Thread实现了终结器而不是IDisposable。推荐的做法是在实现终结器时始终实现IDisposable。杰弗里·里希特wrote该准则“非常重要,应始终无一异常(exception)地遵守”。那么为什么Thread不实现IDisposable?看起来实现IDisposable将是一个不间断的更改,它将允许确定性地清理Thread的可终结资源。还有一个相关的问题:由于线程是可终结的,我是否必须保留对正在运行的线程的引用以防止它们在执行期间被终结? 最佳答案 处理Thread对象会做什么

c# - 如何制作从 C# "Thread-safe"调用的 C (P/invoke) 代码

我有一些使用单个全局变量的简单C代码。显然这不是线程安全的,所以当我在C#中使用P/invoke从多个线程调用它时,事情就搞砸了。如何为每个线程单独导入此函数,或使其成为线程安全的?我尝试声明变量__declspec(thread),但这导致程序崩溃。我还尝试制作一个C++/CLI类,但它不允许成员函数是__declspec(naked),我需要(我正在使用内联汇编)。我在编写多线程C++代码方面经验不足,因此可能缺少某些内容。下面是一些示例代码:C#[DllImport("MyDll.dll",CallingConvention=CallingConvention.Cdecl)]pu

c# - 它有什么区别 - 使用 Task.Run 运行 'async' Action 委托(delegate)(与默认 Action 委托(delegate)相比)?

我正在努力了解async/await并认为我确实了解有关用法的一些事情。但仍然不太清楚在下面的场景中实际好处是什么。查看Task.Run用法。第一种方法使用普通委托(delegate)并使用Thread.Sleep,但第二种方法使用“异步”委托(delegate)和Task.Delay。我的问题是:这对这个方法有什么影响(或没有影响)?该方法本身是一个异步方法。该代码正在创建一个单独的线程(通过Task.Run),并且该线程除了执行该委托(delegate)之外别无他法。因此,即使它在Task.Delay上产生等待,在这种情况下有什么用,因为线程无论如何都是一个孤立的线程,不用于任何其

c# - For 循环导致 Task.Run 或 Task.Start 溢出

遇到问题,希望有人能帮我解决。我尝试在循环中启动4个任务,但我收到ArgumentOutOfRangeException:for(inti=0;i.Run(()=>GetData(i,plcPool[i]));}循环因为i=4而溢出如果我在没有循环的情况下启动任务,它们会毫无问题地运行:tasks[0]=Task.Run(()=>GetData(0,plcPool[0]));tasks[1]=Task.Run(()=>GetData(1,plcPool[1]));tasks[2]=Task.Run(()=>GetData(2,plcPool[2]));tasks[3]=Task.Run

c# - 等待新任务 <T>( ... ) : Task does not run?

问题的延续here:在上述问题中,我有以下函数返回一个任务类型的对象(用于增量测试目的):privatestaticTaskGetInstance(){returnnewTask((Func>)(async()=>{awaitSimpleMessage.ShowAsync("TEST");returnnewobject();}));}当我调用awaitGetInstance();时,该函数被调用(并且我假设任务已返回,因为没有抛出异常)但任务就在那里。我只能猜测我做错了。我不希望此函数返回一个已经在运行的任务(即IMPERATIVE).如何异步运行此函数返回的任务?

c# - 为什么单击树抛出 'System.Windows.Documents.Run' 不是 Visual 或 Visual3D 的 InvalidOperationException?

有时右键单击treeviewitem会导致未处理的InvalidOperationException。在后面的代码中,我选择右键单击的行:staticTreeViewItemVisualUpwardSearch(DependencyObjectsource){while(source!=null&&!(sourceisTreeViewItem))source=VisualTreeHelper.GetParent(source);returnsourceasTreeViewItem;}privatevoidOnPreviewMouseRightButtonDown(objectsende

C# - 线程中止异常(Thread Abort Exception)重新抛出自身

我有当前代码:classProgram{privatestaticvoidMain(){while(true){try{Thread.CurrentThread.Abort();}catch(ThreadAbortException){Console.WriteLine("Abort!");Thread.ResetAbort();}Console.WriteLine("nowwaiting");Console.ReadKey();}}}现在我知道ResetAbort方法应该可以防止ThreadAbortException继续重新抛出自身,即使catch语句正在捕获它,但我的问题是:如果

c# - 在不锁定集合的情况下从通用集合中获取 Count 值是安全的吗?

我有两个线程,一个生产者线程将对象放入通用列表集合中,另一个消费者线程将这些对象从同一个通用列表中拉出。我已经使用lock关键字正确同步了对集合的读取和写入,并且一切正常。我想知道是否可以在不先锁定集合的情况下访问Count属性。JaredPar引用计数属性inhisblog作为可能导致竞争条件的决策程序,如下所示:if(list.Count>0){returnlist[0];}如果列表中有一个项目,并且在访问Count属性之后但在索引器之前删除了该项目,则会发生异常。我明白了。但是使用Count属性可以确定一个完全不同的集合的初始大小吗?MSDNdocumentation说实例成员不

c# - "thread-safe type"到底是什么?我们什么时候需要使用 "lock"语句呢?

我阅读了所有关于线程安全类型和“锁定”语句的文档,但我仍然没有100%理解它。具体什么时候需要使用“lock”语句?它与(非)线程安全类型有何关系?谢谢。 最佳答案 想象一个类的实例,里面有一个全局变量。想象一下,两个线程同时对该对象调用一个方法,并且该方法更新内部的全局变量。变量中的值很可能会被破坏。不同的语言和编译器/解释器会以不同的方式处理这个问题(或者根本不处理......)但关键是你会得到“不希望的”和“不可预测的”结果。现在假设该方法在尝试读取或写入变量之前获得变量的“锁”。第一个调用该方法的线程将获得变量的“锁”,第二