通过异步同步避免死锁并防止UI响应

我们有一个由WPF和/或Winforms客户端使用的库。 我们提供了一个类似于的异步方法: Task GetIntAsync() 我们(不幸的是)还提供了一个同步包装器方法: int GetInt(); 它基本上只是调用异步方法并调用.Result来完成它的任务。 我们最近意识到在某些情况下GetIntAsync一些代码需要在主UI线程上运行(它需要使用标记为“单个”线程模型的传统COM组件(即组件必须在主STA线程中运行而不仅仅是任何STA线程) 所以问题是当在主线程上调用GetInt()时,它将会死锁 .Result阻塞主线程, GetIntAsync()的代码使用Dispatcher.Invoke尝试在主线程上运行。 同步方法已被消耗,因此删除它将是一个重大变化。 因此,我们选择在同步GetInt()方法中使用WaitWithPumping来允许调用主线程。 除了从UI代码中使用GetInt()客户端之外,这种方法GetInt() 。 以前,他们预计使用GetInt()会使UI无法响应 – 也就是说,如果他们从按钮的click事件处理程序中调用GetInt() ,他们会期望在处理程序返回之前不会处理任何Windows消息。 现在消息被抽取,他们的UI响应,并且可以再次点击相同的按钮(并且他们可能不会将其处理程序编码为可重入)。 如果有合理的解决方案,我们希望我们的客户不需要在调用GetInt期间针对响应的UI进行GetInt 题: 有没有办法做一个WaitWithPumping ,它将泵出“调用主要”消息,但不会WaitWithPumping其他与UI相关的消息? 如果客户端UI的行为就像当前显示模式对话框一样,虽然是隐藏的(即用户无法访问其他窗口),但这足以满足我们的目的。 但是,从我读到的内容来看,你无法隐藏modal dialog。 您可以想到的其他解决方法将不胜感激。

如何使用C#连接到Mysql?

我只是C#的初学者。 我正在使用XAMPP服务器用于MySQL数据库和Visual C#2010.然后我在phpMyAdmin中创建了一个名为“testdb”的数据库和一个名为“login”的表。 我在表格中输入了用户名和密码。 我正在做一个简单的WinForm登录,在那里我为用户名和密码以及一个按钮创建了两个文本框。 我完成了我的代码并且没有编译器错误。 但我在一条线上遇到了麻烦。 它说“无法连接到任何指定的MySQL主机”。 我将MySql.Data添加到我的引用中。 我想在登录时获取数据库表中的数据。然后授权用户或如果不匹配,则会提示错误消息。 这是我的代码: using MySql.Data.MySqlClient; public bool Login(string username, string password) { MySqlConnection con = new MySqlConnection(“host=localhost;username…”); MySqlCommand cmd = new MySqlCommand(“SELECT * FROM login WHERE username='” + username + “‘ AND password='” + password + “‘;”); cmd.Connection = con; con.Open(); // This is the line producing […]

投票服务 – C#

有人能帮助我吗? 我正在创建一个连接到SQL数据库的Windows服务,并检查表中的日期并将其与今天的日期进行比较,并更新该数据库中的字段,例如,如果日期等于今天的日期,则该字段将设置为true 。 我遇到的问题是,当我启动服务时,它不会这样做但是当我以正常forms执行它时它完美地工作。 我的代码如下: //System.Timers Timer timer = new Timer(); protected override void OnStart(string[] args) { timer.Elapsed += new ElapsedEventHandler(OnElapsedTime); timer.Interval = 60000; timer.Enabled = true; } private void OnElapsedTime(object source, ElapsedEventArgs e) { int campid = 0; var campRes = new ROS.Process.CampaignServiceController().GetCampainInfo(); foreach (var s in campRes) { campid = s.CampaignId; if (s.CampEndDate.Date […]

如何在c#中使用XMLSerialize for Enum类型的属性?

我有一个简单的枚举: enum simple { one, two, three }; 我也有一个类型simple的类。 我尝试使用以下属性进行装饰: [XmlAttribute(DataType = “int”)] 。 但是,当我尝试使用XmlWriter序列化它时它失败了。 这样做的正确方法是什么? 我是否必须标记枚举本身以及属性,如果是,请使用哪种数据类型?

调试C#代码时的符号问题

我正在使用WinDbg从托管代码(C#,为任何CPU构建的控制台应用程序)加载故障转储,并在x64平台上创建故障转储。 我在x64平台上进行调试。 我已将相关的PDB文件放入符号路径中。 但WinDbg总是从一个奇怪的文件夹中找到符号。 这是一个例子(当我使用时!sym noisy): SYMSRV: c:\MySymbols\FooService.pdb\4311207E2E2D442CB7473828D2488F941\FooService.pdb not found 我的应用程序称为FooService.exe ,相关的PDB文件名为FooService.pdb 。 我已将C:\MySymbols设置为符号路径,并将FooService.pdb复制到目录C:\MySymbols 。 但是为什么WinDbg在C:\MySymbols找不到FooService.pdb ,而是从一个奇怪的子文件夹“FooService.pdb \ 4311207E2E2D442CB7473828D2488F941”? 在我的场景中,为了加载PDB符号文件,最好的解决方案是什么(我必须自己手动创建子文件夹FooService.pdb\4311207E2E2D442CB7473828D2488F941 )?

NaN对双打意味着什么?

NaN和Infinity什么区别? NaN何时出现? 它是什么?

如何设置定时器在c#中的特定时间执行

我有一个要求,我需要在每天00:01:00 AM执行计时器…但我没有得到如何实现这一点..如果我正在采取系统时间,它可以是不同的格式..这里是我的计时器代码.. static System.Timers.Timer timer; timer = new System.Timers.Timer(); timer.Interval = 1000 * 60 * 60 * 24;//set interval of one day timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); start_timer(); static void timer_Elapsed(object sender, ElapsedEventArgs e) { // Add timer code here } private static void start_timer() { timer.Start(); }

ASP.NET | 表单身份validation| 获取所有登录用户(所有用户列表或计数)

我使用的是.NET 3.5。 此外,还使用了表单身份validation。 有没有办法获取所有登录用户的列表或ASP.NET中的计数 ? 注意:我没有使用会员资格和角色

c#中的多变量开关语句

我想使用一个带有几个变量的switch语句,如下所示: switch (intVal1, strVal2, boolVal3) { case 1, “hello”, false: break; case 2, “world”, false: break; case 2, “hello”, false: etc …. } 有没有办法在C#中做这样的事情? (出于显而易见的原因,我不想使用嵌套的switch语句)。

TimeSpan FromMilliseconds奇怪的实现?

我最近在.net timespan实现中遇到了一些奇怪的行为。 TimeSpan test = TimeSpan.FromMilliseconds(0.5); double ms = test.TotalMilliseconds; // Returns 0 FromMilliseconds采用double作为参数。 但是,似乎内部的值是四舍五入的。 如果我使用5000个滴答(.5毫秒)实例化新的时间跨度,则TotalMilliseconds的值是正确的。 查看reflection器中的TimeSpan实现会发现输入实际上已经转换为long。 为什么Microsoft将FromMilliseconds方法设计为使用double参数而不是long(因为在实现时,double值是无用的)?