使用MVP架构的WinForms中BackGroundWorker的最佳实践

我正在开展一个winforms项目。 我正在实现一个MVP架构。 我在演示者处运行了一些处理密集型作业(从文件系统读取并对数据库执行批量插入)。 我想在后台线程中执行这些操作,而不会锁定UI并更新我的视图上的控件(进度条和datagridview)。 我应该只是通过让视图事件处理程序触发演示者正在侦听的事件来访问演示者中的backgroundworker对象并在演示者中处理它的事件吗? 例如: 在视图中: private void backgroundWorker_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) { if (WorkerProgressChange != null) { WorkerProgressChange(this, EventArgs.Empty); } } 在演示者中: _view.WorkerProgressChange += UpdateView; 这看起来合情合理吗? 有人能提供更好的模特吗? 谢谢!

使用C#扫描人机接口设备(HID)

我正在开发一个C#.NET 2.0应用程序,我需要扫描附加的HID。 如何才能做到这一点? 因为它是HID,Windows不会为其分配COM端口。 我只需要以编程方式确定设备是否已连接。 谢谢。 附加信息 当我将USB设备连接到我的计算机时,设备管理器中的人机接口设备下会显示两个条目。 单击其属性可在各自的“详细信息”选项卡中生成此信息: HID兼容设备设备实例ID:HID \ VID_1795&PID_6004 \ 7&2694D932&0&0000 USB人机接口设备设备实例ID:USB \ VID_1795&PID_6004 \ B973000000EB0D00

拖放被执行但它没有被执行 – webdriver

我已经尝试了这两个代码,它被执行但是动作没有执行,任何人都可以告诉我为什么? //Type one approach Actions action = new Actions(Browser.Driver); IWebElement sourceElement = Browser.Driver.FindElement(By.XPath(Filexpath)); IWebElement targetElement = Browser.Driver.FindElement(By.XPath(NewXpath)); //Type two approach Actions Sourcebuilder = new Actions(Browser.Driver); Actions SourceAction = Sourcebuilder.ClickAndHold(sourceElement); Sourcebuilder.Build(); SourceAction.Perform(); /// move and drop Actions builder = new Actions(Browser.Driver); Actions action = builder.MoveToElement(targetElement); builder.Release(targetElement); builder.Build(); action.Perform(); 提前致谢

收听MySQL中的数据库更改

我有一个网页,我使用CRUD操作在MySQL表中进行一些数据操作。 桌面客户端应用程序有很多正在运行的实例,它们与同一个数据库通信,每次我通过网页对这个数据库进行更改时,所有这些客户端都需要收到有关更改的通知。 我真的不知道如何处理这个问题的最佳方法。 桌面客户端应用程序是用C#编写的。 另外我知道,至少在使用ADO.NET提供程序的MySQL中,无法异步通知桌面客户端数据库中发生的更改。 当客户端应用程序定期创建数据库连接并检查MySQL表的更改时,有一个选项。 但是,如果我们有1000个正在运行的实例并且每个实例创建连接并且每2秒读取同一个表,该怎么办? 难道不是非常耗费数据库服务器资源吗? 此外,我们可以在插入/更新/删除时编写触发器,这些触发器填充另一个关于所做更改的表,之后我们将轮询这个新的“changes_made”表。 此外,还有一个选项可以创建套接字服务器,轮询“changes_made”表,如果进行了更改,则将更改数据发送到所有桌面客户端,这些客户端在此上下文中是套接字侦听器。 因此,我们将摆脱客户端进行的轮询,并显着减少数据库连接和数据库负载的总量。 在这里,我想知道什么是解决此类任务的最正确和可扩展的方法。

路径控制器…未找到或未实现IController

我正在使用c#编写使用ASP.NET MVC 5的应用程序。 我需要在应用程序的右上角添加一个全局菜单。 我被告知其他SO使用ChildActionOnly属性的动作。 所以这就是我所做的。 我创建了一个像这样的BaseController public class BaseController : Controller { [ChildActionOnly] public ActionResult ClientsMenu() { using (SomeContext db = new SomeContext()) { return PartialView(db.Database.SqlQuery(“SELECT * FROM clients”).ToList()); } } } 然后我inheritance了BaseController所有控制器,就像这样 public class TasksController : BaseController { public ActionResult Index(int ClientId) { … return View(); } public ActionResult Show(int SurveyId) { … […]

如何同步Database和DataGridView

我一直在尝试通过DataGridView同步数据库。 到目前为止,我已经创建了一个数据模型类。 此类包含与数据库匹配的多个属性。 它们使用System.Data.Linq.Mapping命名空间中的[Table]和[Column]属性进行映射。 好。 所以我使用DataSource -Property将DataGridView绑定到连接到数据库(MSSQL)的DataContext 。 这个逻辑是在单例类中实现的,所以我可以保证这个DataContext有一个实例。 this.m_context = new DataContext(conn); this.m_VisitorTable = m_context.GetTable(); 好吧,如果我将表绑定到DataGridView.DataSource我可以看到数据库中的所有条目都已加载并正确显示。 然后,如果我改变了一些东西,我发现自己面临同步问题。 更改的单元格在数据库端没有更改。 为了保存更改,我实现了这个方法: public void SaveChanges() { try { // I have no idea what I’m doing here. VisitorLogic.Instance.m_VisitorTable.Context.SubmitChanges(System.Data.Linq.ConflictMode.Con // I’m also trying to see if changes were made so I can save them before closing. this.m_bChangesMade = […]

你如何在c ++中调用ac#方法?

他们在这里和这里谈论要做什么,但我似乎无法在c ++中找到我的c#项目。 我已经在c ++项目中添加了c#项目作为参考,但每当我尝试使用我需要的方法时,它都找不到命名空间。 我通过右键单击c ++项目添加它并进入’reference’然后添加了c#项目并添加了新的引用。 两个项目都在同一个解决方案中。 在下面的代码示例中,我给出了完整的c#代码(使用除外)和c ++代码的一部分(我试图从中调用c#方法的方法)。 我还将一些命名空间更改为更通用,并且不包含敏感信息。 c#代码是这样的。 namespace Company.Pins.Bank.Decryption { public class Decrypt { [DllImport(“decryptsn.dll”, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr decryptsn(byte[] InpData); //__declspec(dllimport) char* decryptsn(char* InpData); public static String Decryption(string param2) { byte[] InpData = new byte[255]; InpData = StrToByteArray(param2); return Marshal.PtrToStringAnsi(decryptsn(InpData)); } public static byte[] StrToByteArray(string str) { […]

命名局部常量:UpperCamelCase或lowerCamelCase?

您对C#中的 局部常量使用哪种命名约定?为什么? const int Pi = 3; const int pi = 3; 似乎在较低的驼峰案例之间进行权衡,表明限制范围,而较高的驼峰案例更易读,更容易移到class级。 我注意到StyleCop更喜欢上骆驼箱。

在C ++和C#之间传递vector struct

我有c ++非托管代码,我想从c#访问。 所以我按照了一些教程,为我的项目构建了一个dll(只有一个类btw)。 现在我想从c#中使用它,我正在使用p / invoke,如下所示。 我的问题是:是否有可能对我的Windows点进行编组,以便将其作为向量传递到我的c ++代码中? 我可以更改所有代码(除了qwindows点,但我可以自己指出)。 有没有我不需要创建交流包装的解决方案? 我正在关注这个问题: 如何使用st#:: vector :: iterator作为C#中的参数调用非托管C ++函数? 非常感谢ps,我发现了一个“解决方案”,但我无法查看它http://www.experts-exchange.com/Programming/Languages/C_Sharp/Q_21461195.html C# using Point = System.Windows.Point; class CPlusPlusWrapper { [DllImport(“EmotionsDLL.dll”, EntryPoint = “calibrate_to_file”)] static extern int calibrate_to_file(vector pontos);//marshall here [DllImport(“EmotionsDLL.dll”, EntryPoint = “calibration_neutral”)] static extern int calibration_neutral(); /// /// wraps c++ project into c# /// public void calibrate_to_file() { […]

并行编程:无法访问UI并行?

我正在尝试在wpf c#中创建一个函数的并行执行,它也在UI上运行操作。 但是在运行时,UI控件上的方法总是存在exception:调用线程无法访问此对象,因为不同的线程拥有它。 始终在正在运行的循环的第二个实例上调用exception,因此无法在两个并行运行的实例中操作UI? 是否可以并行访问UI? 码: do { if (listBox_Copy.SelectedIndex < listBox_Copy.Items.Count – 1) { listBox_Copy.SelectedIndex = listBox_Copy.SelectedIndex + 1; listBox_Copy.ScrollIntoView(listBox_Copy.SelectedItem); } listBox_Copy.Focus(); huidigitem = listBox_Copy.SelectedItem as ListBoxItem; currentitemindex = listBox_Copy.SelectedIndex; currentitem = listBox_Copy.ItemContainerGenerator.ContainerFromIndex(currentitemindex) as ListBoxItem; itemgrid = FindVisualChild(currentitem); senderbutton = (Button)sender; Button playcues = itemgrid.FindName(“Playbutton”) as Button; cuetrigger = itemgrid.FindName(“cuetrigger”) as TextBlock; Jobs.Add(playcues); } […]