我有一个UserControl派生的控件显示从Web服务器获取的一些信息.我目前正在进行控制异步初始化,以提高响应能力.
在我的Load事件处理程序中,我正在创建一个CancellationTokenSource,并在各种异步调用中使用关联的Token.
我现在想确保如果用户在异步操作完成之前关闭表单,操作将被取消.换句话说,我想在令牌上调用取消.
我想弄清楚在哪里这样做.如果有一个我可以陷阱的卸载事件,那么这将是完美的 - 但事实并非如此.事实上,我找不到任何看起来合适的事件.
我可以捕获包含Form的close事件,但我真的想保留UserControl本地的所有内容.
建议?
我正在做一个噩梦,试图让一个简单的安装程序在InstallShield LE(VS 2012附带的一个)中运行.我可以解决各种各样的问题(比如我不能再做"重建所有"而不会搞乱一切的事实 - 我需要在开发过程中简单地卸载InstallShield项目).但重要的是,当我构建我的安装程序时,它包含各种DLL的错误版本(包括属于我的项目的那些,以及像Entity Framework DLL这样的第三方).
执行"清理解决方案"甚至没有解决我的解决方案中的DLL的问题.它在我的机器上找到了一个随机版本(在某种编译器临时目录中),并坚持包括它.我最终通过在Windows资源管理器中进行搜索并删除它找到的每个文件来解决这个问题,但我担心下次我发布它时仍然会选择错误的文件.
另外,我需要在我的机器上同时拥有.NET 4和.NET 4.5版本的Entity Framework,并选择了错误的版本进入我的安装程序.我不能删除我不希望它包含的那个.
多么绝非的劣质产品.我可以 "升级"到完整版本,看看是否能解决这些问题,但我最近使用LE版本的经历让我再次使用他们的任何产品.
还有其他人有类似的问题吗?你找到了解决方案吗?
我有一个在Excel 2007中开发的VBA应用程序,它包含以下代码以允许ShellExecute从以下位置访问该函数Shell32.dll:
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Run Code Online (Sandbox Code Playgroud)
我原来说:
显然,该应用程序将无法在64位版本的Windows上进行编译(仍使用32位Office 2007).我认为这是因为
Declare声明需要更新.我已经读过Office 2010引入了一个新的VBA运行时(VB7),并且它有一些新的关键字可以在
Declare语句中使用,以允许它在64位Windows上正常工作.VB7还有新的预定义编译器常量,以支持条件编译,其中将使用旧的或新的声明,具体取决于应用程序是在32位还是64位Windows上运行.但是,由于我遇到Office 2007,我需要一个替代解决方案.我有什么选择?(如果可能的话,我真的不想发布我的应用程序的2个单独版本).
但是,根据大卫在下面的回答,我错误地认为我的Declare陈述不起作用的情况.它无法运行的唯一情况是Windows 64位上的Office 2010 64位.因此,Office 2007不是问题.
Visual Studio 2012似乎不支持Office 2007(它只有Office 2010的项目模板).如果我想创建一个与Office 2007兼容的加载项,我是否需要使用Visual Studio 2010,还是有一种简单的方法来使用VS 2012?
如果是一个办法做到这一点在VS 2012,是否有任何限制/优势等,这样做?
我有一些这样的代码,我用来将数据文件的BULK INSERT写入表中,其中数据文件和表名是变量:
DECLARE @sql AS NVARCHAR(1000)
SET @sql = 'BULK INSERT ' + @tableName + ' FROM ''' + @filename + ''' WITH (CODEPAGE=''ACP'', FIELDTERMINATOR=''|'')'
EXEC (@sql)
Run Code Online (Sandbox Code Playgroud)
这对于标准表来说很好,但是现在我需要做同样的事情来将数据加载到临时表中(例如,#MyTable).但是当我尝试这个时,我得到错误:
Invalid Object Name: #MyTable
Run Code Online (Sandbox Code Playgroud)
我认为问题是由于BULK INSERT语句是在运行中构建然后使用EXEC而执行的,并且#MyTable在EXEC调用的上下文中无法访问.
我需要构造这样的BULK INSERT语句的原因是我需要将文件名插入到语句中,这似乎是唯一的方法.所以,看来我可以既具有可变的文件名,或使用临时表,但不能同时使用.
有没有另一种方法来实现这一点 - 也许通过使用OPENROWSET(BULK...)?
更新: 好的,所以我听到的是BULK INSERT和临时表对我不起作用.感谢您的建议,但在我的情况下,将更多代码移动到动态SQL部分是不切实际的.
经过尝试OPENROWSET(BULK...),似乎遇到了同样的问题,即它无法处理变量文件名,我需要像以前一样动态构造SQL语句(因此无法访问临时表).
所以,这只留下一个选项,即使用非临时表并以不同的方式实现进程隔离(通过确保任何时候只有一个进程可以使用表 - 我可以想到几种方法去做).
它很烦人.按照我最初的预期方式进行操作会更方便.只是其中一件应该是微不足道的事情,但最终会吃掉你整整一天的时间......
我在这篇博文中看到过,但实际上并没有说明如何"启用"它.而且似乎默认情况下它没有启用.
我知道它是一种扩展方法,如下所定义:http://msdn.microsoft.com/en-us/library/hh835786(v = vs.108).aspx但我如何才能访问它?如果我键入,Request.CreateErrorResponse则编译器无法识别它.
我已经using System.Net.Http.
我有一个.NET(C#)应用程序,它广泛使用async/await.我觉得我已经了解了async/await,但我正在尝试使用一个库(RestSharp),它有一个旧的(或者我应该说不同的)编程模型,它使用回调进行异步操作.
RestSharp的RestClient类有一个ExecuteAsync方法,它接受一个回调参数,我希望能够将一个包装器放在允许我进行await整个操作的包装器上.该ExecuteAsync方法看起来像这样:
public RestRequestAsyncHandle ExecuteAsync(IRestRequest request, Action<IRestResponse> callback);
Run Code Online (Sandbox Code Playgroud)
我以为我一切都很好.我曾经TaskCompletionSource把这个ExecuteAsync电话包裹在我可以等待的东西中,如下所示:
public static async Task<T> ExecuteRequestAsync<T>(RestRequest request, CancellationToken cancellationToken) where T : new()
{
var response = await ExecuteTaskAsync(request, cancellationToken);
cancellationToken.ThrowIfCancellationRequested();
return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(response.Content);
}
private static async Task<IRestResponse> ExecuteTaskAsync(RestRequest request, CancellationToken cancellationToken)
{
var taskCompletionSource = new TaskCompletionSource<IRestResponse>();
var asyncHandle = _restClient.ExecuteAsync(request, r =>
{
taskCompletionSource.SetResult(r);
});
cancellationToken.Register(() => asyncHandle.Abort());
return await taskCompletionSource.Task;
}
Run Code Online (Sandbox Code Playgroud)
这对我的大多数应用程序都很好.
但是,我有一部分应用程序ExecuteRequestAsync在单个操作中对我进行数百次调用,该操作显示带有取消按钮的进度对话框.你会在上面的代码中看到我正在传递CancellationToken给ExecuteRequestAsync; …
我正在使用FluentValidation来验证一个对象,因为这个对象有一个我正在尝试使用的集合成员RuleForEach.例如,假设我们有Customer和Orders,并且我们希望确保没有客户订单的总价值超过该客户允许的最大值:
this.RuleForEach(customer => customer.Orders)
.Must((customer, orders) => orders.Max(order => order.TotalValue) <= customer.MaxOrderValue)
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.但是,我还需要记录有关错误上下文的其他信息(例如,在数据文件中找到错误的位置).我发现使用FluentValidation很难实现这一点,到目前为止我最好的解决方案是使用该WithState方法.例如,如果我发现客户的地址详细信息不正确,我可能会这样做:
this.RuleFor(customer => customer.Address)
.Must(...)
.WithState(customer => GetErrorContext(customer.Address))
Run Code Online (Sandbox Code Playgroud)
(GetErrorContext我的方法在哪里提取相关细节.
现在我遇到的问题是,在使用时RuleForEach,方法签名假定我将提供一个引用验证失败Customer的特定表达式,而不是Order导致验证失败的特定表达式.我似乎无法分辨哪个订单有问题.因此,我无法存储适当的上下文信息.
换句话说,我只能这样做:
this.RuleForEach(customer => customer.Orders)
.Must((customer, orders) => orders.Max(order => order.TotalValue) <= customer.MaxOrderValue)
.WithState(customer => ...)
Run Code Online (Sandbox Code Playgroud)
......当我真的想要这样做时:
this.RuleForEach(customer => customer.Orders)
.Must((customer, orders) => orders.Max(order => order.TotalValue) <= customer.MaxOrderValue)
.WithState(order => ...)
Run Code Online (Sandbox Code Playgroud)
是否真的无法访问失败的集合项的详细信息(甚至索引)?
我想另一种看待它的方式是我想WithState拥有一个等价物WithStateForEach......
我有一个SQL Server [2012 Express with Advanced Services]数据库,其中没有太多内容.我正在使用EF Code First开发一个应用程序,由于我的模型仍然处于不稳定状态,因此数据库每天都会被丢弃并重新创建几次.
今天早上,我的应用程序在第一次运行时无法连接到数据库.经过调查,似乎数据库处于"恢复待定"模式.
查看事件日志,我可以看到SQL Server已记录:
启动数据库(我的数据库)
......整晚大约每秒两次.(事件日志填满了,所以昨天晚上我看不到).
这些"信息"日志条目在今天早上6点左右停止,紧接着是"错误"日志条目,说:
资源池"internal"中没有足够的内存来运行此查询
我的数据库发生了什么事?
注意:我可能会让我的Web应用程序在"调试"模式下一夜之间运行 - 尽管没有任何人"驱动"它,我无法想象会有很多数据库流量,如果有的话.
还值得一提的是,我在数据库中有一个全文目录(尽管如我所说,目前数据库中几乎没有任何实际内容).
我不得不说,这很令人担忧 - 如果发生在我的生产数据库中,我会感到很高兴!
我有一个接受几个参数的ApiController方法,如下所示:
// POST api/files
public HttpResponseMessage UploadFile
(
FileDto fileDto,
int? existingFileId,
bool linkFromExistingFile,
Guid? previousTrackingId
)
{
if (!ModelState.IsValid)
return Request.CreateResponse(HttpStatusCode.BadRequest);
...
}
Run Code Online (Sandbox Code Playgroud)
当我发布POST时,我将FileDto对象放在请求的正文中,并将其他参数放在查询字符串上.
我已经发现我不能简单地省略可以为空的参数 - 我需要将它们放在带有空值的查询字符串上.所以,当我不想为可空参数指定值时,我的查询看起来像这样:
http://myserver/api/files?existingFileId=&linkFromExistingFile=true&previousTrackingId=
Run Code Online (Sandbox Code Playgroud)
这与我的控制器方法匹配,并且当执行该方法时,可以为空的参数null(正如您所期望的那样).
但是,对ModelState.IsValid返回的调用false,当我检查它们时,它正在抱怨两个可以为空的参数.(模型的其他位没有错误).消息是:
值是必需的,但请求中不存在.
为什么它认为价值是必需的/不存在的?当然(a)中的值不要求可为空的,和(b)的值是(排序的)本-中的一种方式的空杂交排序?
c# ×4
.net ×2
sql-server ×2
64-bit ×1
async-await ×1
asynchronous ×1
bulkinsert ×1
c#-5.0 ×1
events ×1
excel ×1
memory-leaks ×1
office-2007 ×1
restsharp ×1
sql ×1
t-sql ×1
validation ×1
vba ×1
vsto ×1
winforms ×1