小编Noa*_*Gal的帖子

在C#中使用SQLite和异步

我试图了解async/ await关键字和用法,我认为我得到了基础知识.但是我的SQLite代码中有些东西不能正常工作.

我在一个我一直在研究的简单项目中使用SQLite.core NuGet包.我注意到我写的异步代码不是异步的(就像我预期的那样),所以我创建了一个更简单的测试项目来测试我的理解.

在我的测试代码中,我打开了与内存数据库的连接(我对基于文件的数据库有同样的问题.内存在测试代码中更容易),并发出一个"create table"命令,使用ExecuteNonQueryAsync.我没有立即await得到结果,而是在最终使用await关键字之前向控制台写了一些东西.

我希望控制台命令在ExecuteNonQueryAsync完成之前执行,所以在我的测试中我应该看到"1 2 3 4".但相反,我得到"1 3 2 4"

我使用SQL Server LocalDB连接运行相同的测试(运行相同的代码,只是DbConnection不同),并获得预期的"1 2 3 4".所以我想我对它的基本理解async并不是那么遥远.

我错过了什么?我是否需要在SQLite中使用特殊的连接字符串才能支持这些async方法?它甚至支持它吗?

我的完整测试项目可以在这里找到.

以下是主程序本身:

 namespace DatabaseTest
   {
    using System;
    using System.Data.Common;
    using System.Data.SqlClient;
    using System.Data.SQLite;
    using System.Threading.Tasks;
class Program
{
    static void Main(string[] args)
    {
        Task.WaitAll(TestDatabase(true), TestDatabase(false));
    }

    private static async Task TestDatabase(bool sqLite)
    {
        Console.WriteLine("Testing database, sqLite: {0}", sqLite);
        using …
Run Code Online (Sandbox Code Playgroud)

c# sqlite async-await

4
推荐指数
2
解决办法
6506
查看次数

XNA项目 - 谁负责绘图?

我正在玩XNA,我需要在每个帧中绘制几个不同的模型.此时,Game对象保存对我所有模型的引用,并依次绘制它们.每个都有自己不同的绘图方式 - 一个有两个单独的纹理,另一个可能镜像到另一边,等等.

我想知道是否可以添加一个

public void Draw(SpriteBatch spriteBatch)

我的所有模型的方法(当然是来自BaseModel),并让每个类负责绘制自己,或者我应该坚持让类根据Update方法上的事件(KeyboardState)设置数据,并保持Game类中的所有图形逻辑.

有没有一种首选的方法呢?

xna

3
推荐指数
1
解决办法
790
查看次数

BackgroundWorker OnWorkCompleted抛出跨线程异常

我有一个简单的UserControl用于数据库分页,它使用控制器来执行实际的DAL调用.我使用a BackgroundWorker来执行繁重的工作,并在OnWorkCompleted事件中重新启用一些按钮,更改TextBox.Text属性并为父表单引发事件.

表单A保存我的UserControl.当我点击打开表单B的某个按钮时,即使我没有做任何"那里"并且只是关闭它,并尝试从我的数据库中引入下一页,OnWorkCompleted在工作线程上调用它(而不是我的主线程),并抛出一个跨线程异常.

目前我InvokeRequired在那里的处理程序中添加了一个检查,但是不是OnWorkCompleted要在主线程上调用的全部内容?为什么不按预期工作?

编辑:

我已经设法将问题缩小到arcgis和BackgroundWorker.我有以下解决方案,它添加了一个命令到arcmap,打开一个简单Form1的两个按钮.

第一个按钮运行BackgroundWorker睡眠500毫秒并更新计数器.在该RunWorkerCompleted方法中,它检查InvokeRequired并更新标题,以显示该方法最初在主线程或工作线程内运行.第二个按钮刚打开Form2,不包含任何内容.

首先,所有调用RunWorkerCompletedare都在主线程内完成(正如预期的那样 - 这就是RunWorkerComplete方法的最后一点,至少我从MSDN上了解到的BackgroundWorker)

打开和关闭后Form2,RunWorkerCompleted始终在工作线程上调用.我想补充一点,我可以将此解决方案保留原样(InvokeRequiredRunWorkerCompleted方法中检查),但我想了解为什么它会违背我的期望.在我的"真实"代码中,我想知道该RunWorkerCompleted方法是在主线程上调用的.

我设法form.Show();在我的命令中指出问题BackgroundTesterBtn- 如果我使用ShowDialog(),我没有问题(RunWorkerCompleted总是在主线程上运行).我需要Show()在我的ArcMap项目中使用,以便用户不会绑定到表单.

我还尝试在正常的WinForms项目上重现该错误.我添加了一个简单的项目,只打开没有ArcMap的第一个表单,但在这种情况下我无法重现错误 - RunWorkerCompleted主线程上的运行,无论是我使用的Show()还是ShowDialog()在打开之前和之后Form2.我尝试在我之前添加第三个表单作为主要表单Form1,但它没有改变结果.

是我的简单sln(VS2005sp1) - 它需要

ESRI.ArcGIS.ADF(9.2.4.1420)

ESRI.ArcGIS.ArcMapUI(9.2.3.1380) …

c# multithreading arcgis backgroundworker winforms

3
推荐指数
1
解决办法
1万
查看次数

IntPtr演员与新演员

我只是看一个例子,在其中我看到了代码

return new IntPtr(handle);
Run Code Online (Sandbox Code Playgroud)

在探索我们的代码之后,我发现我们已经使用了类似的模式,但在我们的代码中我们几乎有相同的东西:

return (IntPtr)handle;
Run Code Online (Sandbox Code Playgroud)

这两种情况有区别吗?第二个是否会以任何方式"更好",因为它不会分配新的内存,或者只是隐藏相同的构造函数?

c# intptr

3
推荐指数
2
解决办法
2549
查看次数

检查用户是否具有"程序文件"中的写入权限

我需要检查当前用户是否在Program Files文件夹中具有写权限.
主要问题发生在Vista/7中 - 如果我只是尝试在此位置创建临时文件,我会得到一个异常,即使用户可以使用Windows资源管理器执行此类操作(允许UAC提升后).听起来很合理,因为流程本身并没有以管理员权限运行.
然后我尝试使用这个解决方案,但我总是回到"真实",即使我尝试使用标准(非管理员)用户运行它.

我最终希望能够回答的是,如果用户试图在其中创建目录Program Files,他是否需要提供管理员凭据,或者只需在UAC中单击"继续"即可?
我正在寻找一种方法来回答这个问题,而不是自己提出UAC弹出窗口(任何类型).有一个相对简单的方法吗?

UPDATE

感谢您提供我使用UserData文件夹,但我只需要知道用户是否在该文件夹中具有写访问权限,以便我可以决定是否应该尝试执行自动更新(运行msi),或者不.

c# windows permissions file-permissions

2
推荐指数
1
解决办法
1964
查看次数