草庐IT

同步原语

全部标签

c# - 将同步方法变成异步方法

我正在尝试将一些旧代码的同步方法转换为异步方法,但我在理解时遇到了一些麻烦。从我读过的所有视频和教程来看,他们似乎正在创建两种方法:一种是实际功能,另一种是包装器,然后是在UI上调用的包装器。这是我的代码:privateasyncTasklogin(Stringusername,Stringpassword){vartcs=newTaskCompletionSource();RestSharp.RestRequestrequest=newRestSharp.RestRequest("/accounts/login/",RestSharp.Method.GET);RestSharp.IR

c# - 在实现具有同步和异步 API 的库以实现相同功能时使用 async await

关于如何在库中提供相同功能的同步和异步实现,我有几个问题。我会先问他们,然后提供下面的示例代码(实际上很多,但实际上很简单)。有没有办法避免违反DRY原则?考虑JsonStreamReader.Read的实现,JsonStreamWriter.Write,JsonStreamWriter.Flush,ProtocolMessenger.Send,ProtocolMessenger.Receive及其异步版本。在对同一方法的同步和异步版本进行单元测试时,是否有一种方法可以避免违反DRY原则?我正在使用NUnit,尽管我想所有框架在这方面应该都是一样的。应该如何实现返回Task的方法或Ta

c# - Lucene.Net 写/读同步

我可以在打开索引(使用IndexReader)时将新文档写入(使用IndexWriter)吗?还是必须在写作之前关闭阅读?当索引打开用于写入(使用IndexWriter)时,我可以在索引中读取/搜索文档(使用IndexReader)吗?还是我必须在阅读之前关闭写作?Lucene.Net线程是否安全?还是必须自己写? 最佳答案 您可以随时打开任意数量的阅读器/搜索器,但只能打开一个写入器。这是由目录特定的锁强制执行的,通常涉及名为“write.lock”的文件。读者打开快照,作者向索引添加更多数据。在您的作者提交(IndexWrite

c# - C# 泛型如何影响具有原语的集合

据我了解,C#/.Net泛型支持某种程度的具体化。所以,如果我有以下代码:Listlist=newList();list.Add(1);值1会被自动装箱还是“列表”对象会有效地处理原始整数? 最佳答案 不,它不会装箱。在执行时,List的后备数组将真正成为int[].请注意,这不仅仅是真正的原始类型的情况-List不会装箱任何值类型的值(假设它被声明为List等而不是List)。基本上,.NET中的泛型比它们在Java中保存的信息多得多-CLRnative理解泛型并适本地处理它们,而不是在JVM几乎不了解泛型的Java中。例如,如果

c# - 是否有一种通用的方法来同步异步方法?

我们有一个常见的场景,我们有一个方法异步执行一些操作并在完成时引发一个事件。有时我们希望它同步完成,所以我们的代码看起来类似于:ManualResetEventreset=newManualResetEvent(false);someobject.AsyncActionDone+=(sender,args)=>reset.Set();someobject.PerformAsyncAction();reset.WaitOne();有没有办法编写一个辅助方法来做到这一点?我可以传递要执行的操作,但我不确定如何传递让辅助方法知道要监听哪个事件的东西,因为它看起来不像你可以传递EventHan

c# - 在异步操作后立即调用 Task.Wait() 是否等同于同步运行相同的操作?

换句话说,就是vartask=SomeLongRunningOperationAsync();task.Wait();功能相同SomeLongRunningOperation();换句话说,就是vartask=SomeOtherLongRunningOperationAsync();varresult=task.Result;功能相同varresult=SomeOtherLongRunningOperation();根据Task.WaitandInlining,如果正在等待Wait的任务已经开始执行,则Wait必须阻塞。然而,如果它还没有开始执行,Wait可能能够将目标任务从它排队的调

c# - CurrentCulture with async/await,自定义同步上下文

我有一个Web应用程序,我通过async/await使用了很多异步操作。一切正常,但当我创建自定义任务以并行运行多个任务时,我注意到,在此任务中,当前文化在等待后发生了变化。问题似乎是,线程池使用操作系统的文化,这与请求的文化不同,默认同步不会更新文化,即使在任务中更改当前线程的文化。所以我创建了一个自定义同步上下文:publicsealedclassCulturePreservingSynchronizationContext:SynchronizationContext{privateCultureInfoculture;privateCultureInfocultureUI;pu

c# - 为什么每个 Dispatcher.BeginInvoke 回调都有一个唯一的同步上下文?

我刚刚注意到,在.NET4.5中,每个Dispatcher.BeginInvoke/InvokeAsync回调都在其自己非常独特的同步上下文(的实例)上执行DispatcherSynchronizationContext).这种变化背后的原因是什么?以下简单的WPF应用说明了这一点:usingSystem;usingSystem.Diagnostics;usingSystem.Threading;usingSystem.Windows;usingSystem.Windows.Threading;namespaceWpfApplication{publicpartialclassMain

c# - 如果静态只读成员调用静态方法获取值,是否同步完成?

给定:publicclassMyClass{privatestaticreadonlyDictionarymydict=CreateDictionary();privatestaticDictionaryCreateDictionary(){...}}这是同步完成的吗?(即MyClass的两个快速实例化是否会导致CreateDictionary()被调用两次? 最佳答案 是的,它是线程安全的。IstheC#staticconstructorthreadsafe?Staticconstructorsareguaranteedtober

c# - 双向文件夹同步加密以保护我的 Dropbox 数据

我想写一个小的.NET脚本/工具,它至少大部分与SecretSync相同。或BoxCryptor,但没有将加密key存储在公司的网络服务器上。首先,这听起来很简单:您有两个文件夹——“解密”文件夹和“加密”文件夹。在这两个文件夹上都有一个FileSystemWatcher因此,当文件发生更改时,该工具会收到通知。如果“解密”文件夹中的文件发生更改,它会加密该文件并将其写入“加密”文件夹。如果“加密”文件夹中的文件发生更改,它会解密该文件并将其写入“解密”文件夹。目前没问题。但是,如果用户直接从“已解密”文件夹运行应用程序(例如KeePass),会发生什么情况?同步和加密过程现在会遇到问