Tag: 同步

C#TCP服务器组合接收的数据

我正在研究一个粗略的TCP服务器/客户端。 它的工作方式如下:客户端向服务器发送消息>服务器将所有用户数据发送到每个客户端。 我有一个循环,因为我将在游戏中使用这种多人游戏数据传输。 但是,出于某种原因,我的服务器会将传入的数据组合成一个字符串,而不是逐行读取。 例如,对于用户数据,它应该读取类似john:0 | 0的内容,但它读起来像john:0 | 0john:0 | 0john:0 | 0john:0 | 0我尝试设置发送和接收延迟,但是如果我延迟超过100毫秒,它似乎只能起作用。 服务器 class Program { private static Socket _serverSocket; private static readonly List _clientSockets = new List(); private const int _BUFFER_SIZE = 2048; private const int _PORT = 100; private static readonly byte[] _buffer = new byte[_BUFFER_SIZE]; public static bool clientConnected […]

是否有“单项大小的异步任务缓冲区”这样的同步工具?

很多时候在UI开发中我处理事件的方式是当事件第一次出现时 – 我立即开始处理,但如果有一个处理操作正在进行中 – 我等待它完成,然后再处理另一个事件。 如果在操作完成之前发生多个事件 – 我只处理最近的事件。 我通常这样做的方式我的进程方法有一个循环,在我的事件处理程序中,我检查一个字段,指示我当前是否正在处理某些事情,如果我 – 我把我当前的事件参数放在另一个基本上是一个项目大小的字段中缓冲区和当前处理过程完成时 – 我检查是否有其他事件要处理,我循环直到我完成。 现在这似乎有点过于重复,可能不是最优雅的方式,虽然它似乎对我来说工作正常。 那我有两个问题: 我需要做的是否有名字? 是否有一些可重复使用的同步类型可以为我做到这一点? 我正在考虑在我的工具包中添加一些由Stephen Toub提供的异步协调原语。

同步访问ASP.NET会话的成员

我正在构建一个Javascript应用程序,而eash用户有一个单独的UserSession。 该应用程序进行了一堆Ajax调用。 每个Ajax调用都需要访问用户的单个UserSession对象。 每个Ajax调用都需要一个UserSession对象。 UserSession对象中的数据对每个用户都是唯一的。 最初,在每次Ajax调用期间,我都会创建一个新的UserSession对象,并且它的数据成员存储在ASP.NET Session中。 但是,我发现UserSession对象正在被大量实例化。 为了最小化UserSession对象的构造,我将其包装在Singleton模式中并对其进行同步访问。 我相信同步发生在应用程序范围内,但我只需要按用户进行。 我在这里看到一篇post说ASP.NET缓存是同步的,但是创建对象并将其插入缓存之间的时间另一个Thread可以开始构建它的另一个对象并将其插入缓存中。 这是我正在同步访问对象的方式。 有没有比使用“lock”更好的方法…应该锁定HttpContext.Session对象? private static object SessionLock = new object(); public static WebSession GetSession { get { lock (SessionLock) { try { var context = HttpContext.Current; WebSession result = null; if (context.Session[“MySession”] == null) { result = new WebSession(context); context.Session[“MySession”] = result; } else { […]

为什么来自线程教程的MSDN示例崩溃?

来自MSDN “线程教程”的示例4 以下代码错误出现在“—错误就在这里—”的行中。 怎么了? using System; using System.Threading; public class MutexSample { static Mutex gM1; static Mutex gM2; const int ITERS = 100; static AutoResetEvent Event1 = new AutoResetEvent(false); static AutoResetEvent Event2 = new AutoResetEvent(false); static AutoResetEvent Event3 = new AutoResetEvent(false); static AutoResetEvent Event4 = new AutoResetEvent(false); public static void Main(String[] args) { Console.WriteLine(“Mutex Sample […]

为什么InvokeRequired比WindowsFormsSynchronizationContext更受欢迎?

任何时候初学者都会问: 如何从C#中的另一个线程更新GUI? ,答案很简单: if (foo.InvokeRequired) { foo.BeginInvoke(…) } else { … } 但使用它真的很好吗? 在非GUI线程执行foo.InvokeRequired , foo的状态可以改变。 例如,如果我们在foo.InvokeRequired之后关闭表单,但在foo.BeginInvoke之前,调用foo.BeginInvoke将导致InvalidOperationException : 在创建窗口句柄之前,无法在控件上调用Invoke或BeginInvoke。 如果我们在调用InvokeRequired之前关闭表单,则不会发生这种情况,因为即使从非GUI线程调用它也是false 。 另一个例子:假设foo是一个TextBox 。 如果你关闭表单,之后非GUI线程执行foo.InvokeRequired (这是假的,因为表单已关闭)和foo.AppendText它将导致ObjectDisposedException 。 相反,在我看来,使用WindowsFormsSynchronizationContext要容易得多 – 只有当线程仍然存在时,才会使用Post发布回调,如果线程不再存在,则使用Send同步调用Send抛出InvalidAsynchronousStateException 。 是不是更容易使用WindowsFormsSynchronizationContext ? 我错过了什么吗? 如果它不是真的线程安全,为什么我应该使用InvokeRequired-BeginInvoke模式? 你觉得哪个更好?

在C#中同步包装异步方法

我有一个第三方库,其中包含一个异步执行函数的类。 该类inheritance自Form。 该function基本上基于存储在数据库中的数据执行计算。 完成后,它会在调用表单中调用_Complete事件。 我想要做的是同步调用该函数,但是从非Windows窗体应用程序。 问题是,无论我做什么,我的应用程序块和_Complete事件处理程序永远不会触发。 从Windows窗体我可以通过使用“完整”标志和“while(!complete)application.doevents”来模拟同步运行的函数,但显然application.doevents在非Windows窗体应用程序中不可用。 有什么东西阻止我在Windows窗体应用程序之外使用类的方法(由于它inheritance自’Form’)? 有什么方法可以解决这个问题吗? 谢谢,迈克

是“双重检查锁定是破碎”只有java的东西?

http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html上的页面说,双重检查锁定在java中是有缺陷的。 我只是想知道它是否也适用于其他语言(C#,Vb,C ++等) 我读过双重检查锁定模式:是否破碎? , 这是双重检查锁定? , 如何解决Java中的“双重检查已破坏”声明? 说实话,我不知道共同的共识是什么。 有人说是的,其他人说不。 无论如何,我的问题是它是否也适用于其他语言(C#,Vb,C ++等)

使用私有变量锁定c#

根据Eric Gunnerson的说法 别 使用锁(这个) 使用锁(typeof()) Do锁定私有变量,而不是用户可以看到的内容如果需要私钥锁定,请使用“object key = new object()” 是什么原因??

相当于C#中的PostMessage与主线程与MVVM同步?

我必须坚持不懈地寻找,因为这是我无法解决的另一个看似常见的问题。 这是我的问题 – 我正在使用WPF和MVVM,并且我有一个在模型中执行的状态机。 如果发生错误,我需要将信息传递给ViewModel以显示错误。 这部分似乎工作正常。 当用户单击所需行为时,模型中的代码将继续,并查看用户与之交互的对象以确定下一步操作。 问题是模型需要重新加载文件,该文件使用所述文件的内容更新GUI。 因为模型在一个线程中执行,你可以想象我接下来要问的问题 – 你到底该如何正确地与GUI同步? 在MFC中,我会使用SendMessage或PostMessage来完成GUI更新。 我读过WinForms的文章 ,建议使用InvokeRequired在必要时自动调用BeginInvoke。 我实际上不知道BeginInvoke会完成我想要的东西,所以我被鼓励学习这个。 我如何从我的模型中实际调用BeginInvoke? 这种方法甚至适用于WPF吗? 我继续并实现了一个委托,然后调用了Invoke,但是我得到了同样的错误,告诉我无法从这个线程修改集合。 我也尝试过BeginInvoke,但我认为这也行不通,因为它无论如何都会从另一个线程启动。 困惑。 如果我错过了一些非常明显的内容,这些内容已经发布在互联网上,请继续给我一个口头抨击,我可能应该得到它。 编辑 – 我应该补充一点,我正在寻找除定时器或基于BackgroundWorker的解决方案以外的东西,除非这是在WPF / MVVM中解决这个问题的唯一方法。 另外,我想知道是否有任何MVVM工具包已经具有此类function的设施……

是否有一个同步类来保证C#中的FIFO顺序?

它是什么以及如何使用? 我需要它,因为我有一个每秒插入DB的计时器,并且我在计时器处理程序和主线程之间有一个共享资源。 我想保证,如果计时器处理程序在插入中花费超过一秒钟,则应按顺序执行等待的线程。 这是我的计时器处理程序的示例代码 private void InsertBasicVaraibles(object param) { try { DataTablesMutex.WaitOne();//mutex for my shared resources //insert into DB } catch (Exception ex) { //Handle } finally { DataTablesMutex.ReleaseMutex(); } } 但目前互斥锁并不保证任何订单。 我提出详细的问题后没有答案!