任务并行库很棒,在过去的几个月里我经常使用它.但是,有一些事情让我感到困扰:事实TaskScheduler.Current是默认的任务调度程序,而不是TaskScheduler.Default.这在文档和样本中乍一看绝对不是很明显.
Current可以导致细微的错误,因为它的行为正在改变,这取决于你是否在另一个任务中.哪个不容易确定.
假设我正在编写异步方法库,使用基于事件的标准异步模式来表示原始同步上下文的完成,这与XxxAsync方法在.NET Framework中完全相同(例如DownloadFileAsync).我决定使用任务并行库来实现,因为使用以下代码实现此行为非常容易:
public class MyLibrary
{
public event EventHandler SomeOperationCompleted;
private void OnSomeOperationCompleted()
{
SomeOperationCompleted?.Invoke(this, EventArgs.Empty);
}
public void DoSomeOperationAsync()
{
Task.Factory.StartNew(() =>
{
Thread.Sleep(1000); // simulate a long operation
}, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default)
.ContinueWith(t =>
{
OnSomeOperationCompleted(); // trigger the event
}, TaskScheduler.FromCurrentSynchronizationContext());
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切运作良好.现在,让我们在WPF或WinForms应用程序中单击按钮调用此库:
private void Button_OnClick(object sender, EventArgs args)
{
var myLibrary = new MyLibrary();
myLibrary.SomeOperationCompleted += (s, e) => DoSomethingElse();
myLibrary.DoSomeOperationAsync(); // call that triggers the …Run Code Online (Sandbox Code Playgroud) .net c# conceptual synchronizationcontext task-parallel-library
Visual Studio 2010中的集成Web部署非常好.它可以创建一个可以在目标IIS计算机上使用MSDeploy部署的程序包.问题是,这个软件包将被重新分发给一个客户端,当安装MSDeploy时,客户端将使用IIS中的"导入应用程序"自行安装它.
创建的默认包始终包含开发计算机的完整路径,源清单文件中的"D:\ Dev\XXX\obj\Debug\Package\PackageTmp".它不会阻止安装,因为它是以这种方式设计的,但它在导入对话框中看起来很丑,对客户端没有任何意义.更糟糕的是,他会想知道这些路径是什么,看起来很混乱.
通过自定义.csproj文件(通过添加包创建任务使用的MSBuild属性),我设法向包中添加其他参数.但是,我花了大部分时间在2600行的Web.Publishing.targets中试图了解哪些参数影响了"开发路径"行为,徒劳无功.我也尝试使用setAcl在部署后自定义给定文件夹的安全性,但我只是通过使用相对路径设法使用MSBuild ...但是如果我解决了第一个问题则无关紧要.
我可以在创建后修改生成的存档,但我更喜欢使用MSBuild自动化所有存档.有谁知道这是怎么做到的吗?
当TextName内容发生变化时,我有一个列表框可以通过此查询绑定:
var players =
from p in context.Player
where p.GivenName.StartsWith(TextName.Text.Trim())
select p;
listNames.ItemsSource = players.ToList();
Run Code Online (Sandbox Code Playgroud)
它显示了以文本框中的文本开头的玩家名称.现在,当我从列表框中单击任何项目(名称)时,我需要TextName显示在列表框中选择的玩家名称.我试着用这种方式绑定它:
<TextBox ... Text="{Binding Source=listNames, Path=SelectedItem.Content}" ... />
Run Code Online (Sandbox Code Playgroud)
但是,当我单击一个ListboxItem时,文本框才会被清除,并且不会显示任何内容..在设置DisplayMemeberPath时,我是否必须像设置列表框一样设置文本框?我只需要单向绑定!! 我能做什么??
新的只读接口在.NET 4.5,如IReadOnlyCollection<T>和IReadOnlyDictionary<TKey,TValue>是非常有用的,特别是因为他们已经在通用的BCL实现,例如Collection<T>,List<T>和Dictionary<TKey,TValue>.
但是,HashSet<T>并SortedSet<T>没有升级到实现IReadOnlyCollection<T>,我看不到这个决定背后的逻辑,因为这些类匹配接口而没有任何修改或改变.是不是被BCL团队忽视了,还是我在这里缺少什么?
(这尤其令人讨厌,因为没有内置的方法将一个集合包装在一个内部IReadOnlyCollection<T>.确实,ReadOnlyCollection<T>包装IList<T>而不是ICollection<T>.我知道编写自己的包装器是微不足道的.)
在Write-Ahead Logging模式下使用System.Data.Sqlite 1.0.86.0(包括SQLite 3.7.17),我在同时读取时遇到数据库锁定,如果我正确理解WAL,则不应该这样.我没有编写或提交任何内容,并且ReadCommitted正确使用事务隔离模式来避免序列化读取.
准备"选择"状态时,SQLite DB(带WAL)被锁定 - 为什么?是一个类似的问题.唯一的答案是关于sqlite3_reset每个之后的调用sqlite3_step,这是由我在源代码中看到的System.Data.Sqlite正确完成的.
完全复制:
internal static class Program {
private const string DbFileName = "test.sqlite";
private static readonly string _connectionString = BuildConnectionString(DbFileName);
internal static void Main() {
File.Delete(DbFileName);
ExecuteSql("CREATE TABLE Test (Id INT NOT NULL, Name TEXT);", true);
for (int i = 0; i < 10; i++)
Task.Run(() => ExecuteSql("SELECT Id, Name FROM Test;", false));
Console.ReadKey();
}
private static string BuildConnectionString(string fileName) {
var builder = …Run Code Online (Sandbox Code Playgroud) 以下Java方法无法编译:
<T extends Number> void foo(T t)
{
Class<? extends T> klass = t.getClass();
}
Run Code Online (Sandbox Code Playgroud)
收到的错误是:类型不匹配:无法转换Class<capture#3-of ? extends Number>为Class<? extends T>
有人可以解释为什么Class<? extends T>无效,但是没问题Class<? extends Number>吗?
Javadoc说:
实际结果类型是
Class<? extends |X|>| X | 是调用getClass的表达式的静态类型的擦除.例如,此代码片段中不需要强制转换:
Number n = 0;
Class<? extends Number> c = n.getClass();
Run Code Online (Sandbox Code Playgroud) 每次我写一个带有表示选项的布尔参数的方法时,我发现自己在想:"我应该用枚举来替换它,这会使读取方法调用变得更容易吗?".
考虑以下一个对象,它接受一个参数来判断实现是否应该使用它的线程安全版本(我不是在这里问这样做这样做是不是好的设计,只是使用了布尔值):
public void CreateSomeObject(bool makeThreadSafe);
CreateSomeObject(true);
Run Code Online (Sandbox Code Playgroud)
当调用在声明旁边时,参数的目的当然显而易见.当它在一些你几乎不知道的第三方库中时,很难立即看到代码的作用,相比之下:
public enum CreationOptions { None, MakeThreadSafe }
public void CreateSomeObject(CreationOptions options);
CreateSomeObject(CreationOptions.MakeThreadSafe);
Run Code Online (Sandbox Code Playgroud)
它更好地描述了意图.
当有两个表示选项的布尔参数时,情况变得更糟.看看ObjectContext.SaveChanges(bool)Framework 3.5和4.0之间发生了什么.它已被淘汰,因为已经引入了第二个选项,并且整个事物已经转换为枚举.
虽然在有三个或更多元素的情况下使用枚举似乎很明显,但在这些特定情况下,您对使用枚举而不是布尔值有什么看法和经验?
图片可以说出千言万语.
当我爬上可视树时,我看到最后一个父类型为System.Windows.Controls.Pimitives.PopupRoot

但乳清我尝试实际比较那种类型VS抱怨它无效.

我正在使用winforms编写一个C#应用程序.我有一个列表框.我从xml文件,用户名和他们的ID获取我的数据.我想要在列表框中显示名称,当我选择其中一个时,我想使用selectedValue属性获取他/她的id.但是我不能这样做.我尝试了keyValuePair,它在列表框中显示"[username,id]",这是不好的(参见下面的代码).我怎样才能在c#中模拟html select?我希望名称显示在列表框中,但希望在后端获取id.谢谢...
LB_UserList.Items.Add(new KeyValuePair<string, string>(full_name, node["user_id"].InnerText));
Run Code Online (Sandbox Code Playgroud) .net ×3
c# ×2
reflection ×2
wpf ×2
.net-4.5 ×1
64-bit ×1
binding ×1
code-design ×1
collections ×1
conceptual ×1
concurrency ×1
generics ×1
java ×1
jvm ×1
linq ×1
listbox ×1
msbuild ×1
msdeploy ×1
optimization ×1
pointers ×1
sqlite ×1
winforms ×1