volatile
C#中关键字的用途是什么?
我需要在哪里使用此关键字?
我看到以下声明,但我无法理解为什么volatile
需要这里?
internal volatile string UserName;
Run Code Online (Sandbox Code Playgroud) 我在http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx?cs-save-lang=1&cs-lang=csharp上阅读有关异步函数调用的内容.
在第一个例子中,他们这样做,我得到:
Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
// You can do work here that doesn't rely on the string from GetStringAsync.
DoIndependentWork();
string urlContents = await getStringTask;
Run Code Online (Sandbox Code Playgroud)
但他们解释说,如果没有任何工作要做,你可以这样做:
string urlContents = await client.GetStringAsync();
Run Code Online (Sandbox Code Playgroud)
根据我的理解,await
关键字将暂停代码流,直到函数返回.那么这有什么不同:
string urlContents = client.GetString();
Run Code Online (Sandbox Code Playgroud)
?
我正在尝试使用该IDataErrorInfo
接口在我的WPF应用程序中实现验证,并且我遇到了一个不太理想的情况.
我有这个模板,当控件无法验证时使用
<ControlTemplate x:Key="errorTemplate">
<DockPanel LastChildFill="true">
<Border Background="Red" DockPanel.Dock="Right" Margin="5,0,0,0" Width="20" Height="20" CornerRadius="10"
ToolTip="{Binding ElementName=customAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">
<TextBlock Text="!" VerticalAlignment="Center" HorizontalAlignment="Center" FontWeight="Bold" Foreground="White" />
</Border>
<AdornedElementPlaceholder Name="customAdorner" VerticalAlignment="Center" >
<Border BorderBrush="red" BorderThickness="1" />
</AdornedElementPlaceholder>
</DockPanel>
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)
一切顺利,直到我尝试在验证失败的控件上方显示某些内容,例如在其上方显示停靠项:
如何避免这种情况并使我的错误模板显示在停靠项目下方,因为它应该如此?
编辑
我发现我可以TextBox
用一个AdornerDecorator
来修复它,但我真的不想为TextBox
我的应用程序中的每个控件执行此操作.有没有办法用一种Style
或其他方式设置它?
编辑2
我可能会更改默认的TextBox
ControlTemplate以包含一个AdornerDecorator
,但我不太热衷于更改任何WPF的默认控件模板.欢迎任何其他建议.
我是c#5异步功能的新手.我试图理解这两个实现之间的区别:
实施1:
private void Start()
{
foreach(var url in urls)
{
ParseHtml(url);
}
}
private async void ParseHtml(string url)
{
var query = BuildQuery(url); //BuildQuery is some helper method
var html = await DownloadHtml(query);
//...
MyType parsedItem = ParseHtml(html);
SaveTypeToDB(parsedItem);
}
private async Task<string> DownloadHtml(string query)
{
using (var client = new HttpClient())
try
{
var response = await client.GetAsync(query);
return (await response.Content.ReadAsAsync<string>());
}
catch (Exception ex)
{
Logger.Error(msg, ex);
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
实施2:
private void DoLoop()
{
foreach(var …
Run Code Online (Sandbox Code Playgroud) 在尝试签署由我工作的公司创建的一些安装程序时,我遇到了一个错误,我无法解决.我使用相同的证书,已成功使用另一台机器(Win7)以相同的方式签署准相同的安装程序.无论如何,在运行CruiseControl.net的Windows Server 2008上,我尝试使用signtool.exe对安装程序进行签名,但它失败并出现以下错误:
The following certificates were considered:
Issued to: <our company>
Issued by: <some ca>
Expires: <is valid>
SHA1 hash: <...>
Issued to: <...>
Issued by: <...>
Expires: <...>
SHA1 hash: <...>
After EKU filter, 1 certs were left.
After expiry filter, 1 certs were left.
After Subject Name filter, 1 certs were left.
After Private Key filter, 0 certs were left.
SignTool Error: No certificates were found that met all the given criteria.
Run Code Online (Sandbox Code Playgroud)
我尝试将证书安装到不同的证书库,尝试使用不同版本的signtool.exe并尝试直接使用.cer文件,但没有区别.我在所有情况下都收到了上述错误.我尝试了以下命令行命令
signtool.exe sign /debug /n …
Run Code Online (Sandbox Code Playgroud) 我有一个负责检索资源的课程,这些课程也会对它们进行快速访问.该类公开了一种用于检索资源的异步方法:
public Task<object> GetResourceAsync(string resourceName)
{
return Task.Factory.StartNew<object>(() =>
{
// look in cache
// if not found, get from disk
// return resource
});
}
Run Code Online (Sandbox Code Playgroud)
然后客户端代码如下所示:
myResourceProvider.GetResourceAsync("myResource")
.ContinueWith<object>(t => Console.WriteLine("Got resource " + t.Result.ToString()));
Run Code Online (Sandbox Code Playgroud)
这样,始终使用后台线程.但是,如果在缓存中找到对象,我不希望代码异步运行.如果在缓存中找到它,我想立即返回资源而不必使用另一个线程.
谢谢.
有一堆,ObservableCollection<MeClass> Result
并要求将它们全部组合到另一个,ObservableCollection<MeClass> AllResults
所以我可以在一个显示它listview
.
只是不确定如何将它们合二为一.
我创建了一个新类,将它们组合在一起但不确定在我获得列表后它们将如何更新...所以不确定要采取哪个方向.
我知道INotifyPropertyChanged
我只是不确定如何将它们全部组合并随着一切变化而不断更新.
我一直在寻找互联网的高低,但找不到一些可以帮助我的例子.
我正在用wpf开发一个应用程序,在其中我用了一个DataGrid
; 每个细胞都有一个DataTemplate
带有图像的马赛克风格; 在网格的一侧,我有一些瓷砖在网格上使用.
我能够拖动瓷砖但不能将它们放在网格上,因为我找不到制作掉落的单元格.有没有办法从拖拽事件中获取单元格位置?
谢谢
我在MEF的部件生命周期中遇到了一些问题,导致我的Prism应用程序中出现内存泄漏.
我的应用程序导出视图和视图模型,并将PartCreationPolicy
其设置为CreationPolicy.NonShared
.视图和视图模型分别继承ViewBase
和ViewModelBase
实现IDisposable
.
现在,由于我的部件实现了IDisposable
,因此容器会保留对它们的引用,这会导致它们不被垃圾收集器释放.根据MEF关于部件寿命的文档,这是设计的:
除非满足下列条件之一,否则容器将不会保留对其创建的零件的引用:
- 该部分标记为
Shared
- 该部分实现
IDisposable
- 一个或多个导入配置为允许重构
那怎么能让MEF不参考这些部分呢?是否有一个属性我可以用来让MEF知道我不希望它保留对我的部分的引用,即使它实现了IDisposable
?
上述文章中讨论的两种策略对我来说似乎都不是很好的解决方案:
ReleaseExport
需要一个Export
对象作为参数,我不知道如何提供.我有我的观点的实例,但是我无法知道用于创建视图的合同是什么.如果有一个重载ReleaseExport
可以接收容器创建的任何对象,那将会很棒.任何帮助将不胜感激.
我正在使用代码来模拟用户帐户以访问文件共享.
public class Impersonator :
IDisposable
{
#region Public methods.
// ------------------------------------------------------------------
/// <summary>
/// Constructor. Starts the impersonation with the given credentials.
/// Please note that the account that instantiates the Impersonator class
/// needs to have the 'Act as part of operating system' privilege set.
/// </summary>
/// <param name="userName">The name of the user to act as.</param>
/// <param name="domainName">The domain name of the user to act as.</param>
/// <param name="password">The password of the user to act as.</param> …
Run Code Online (Sandbox Code Playgroud) c# ×6
.net ×5
wpf ×3
async-await ×2
asynchronous ×2
c#-5.0 ×2
windows ×2
.net-4.0 ×1
certificate ×1
code-signing ×1
datagrid ×1
mef ×1
memory-leaks ×1
prism ×1
private-key ×1
signtool ×1
validation ×1
volatile ×1
xaml ×1