小编Jul*_*ain的帖子

为什么TaskScheduler.Current是默认的TaskScheduler?

任务并行库很棒,在过去的几个月里我经常使用它.但是,有一些事情让我感到困扰:事实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

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

VS2010 Web Deploy:如何删除绝对路径并自动化setAcl?

Visual Studio 2010中的集成Web部署非常好.它可以创建一个可以在目标IIS计算机上使用MSDeploy部署的程序包.问题是,这个软件包将被重新分发给一个客户端,当安装MSDeploy时,客户端将使用IIS中的"导入应用程序"自行安装它.

创建的默认包始终包含开发计算机的完整路径,源清单文件中的"D:\ Dev\XXX\obj\Debug\Package\PackageTmp".它不会阻止安装,因为它是以这种方式设计的,但它在导入对话框中看起来很丑,对客户端没有任何意义.更糟糕的是,他会想知道这些路径是什么,看起来很混乱.

通过自定义.csproj文件(通过添加包创建任务使用的MSBuild属性),我设法向包中添加其他参数.但是,我花了大部分时间在2600行的Web.Publishing.targets中试图了解哪些参数影响了"开发路径"行为,徒劳无功.我也尝试使用setAcl在部署后自定义给定文件夹的安全性,但我只是通过使用相对路径设法使用MSBuild ...但是如果我解决了第一个问题则无关紧要.

我可以在创建后修改生成的存档,但我更喜欢使用MSBuild自动化所有存档.有谁知道这是怎么做到的吗?

msbuild visual-studio-2010 msdeploy

15
推荐指数
1
解决办法
5489
查看次数

如何将列表框selecteditem内容绑定到文本框?

当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时,我是否必须像设置列表框一样设置文本框?我只需要单向绑定!! 我能做什么??

linq wpf binding

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

为什么HashSet <T>不实现IReadOnlyCollection <T>?

新的只读接口在.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>.我知道编写自己的包装器是微不足道的.)

collections base-class-library .net-4.5

10
推荐指数
2
解决办法
1583
查看次数

数据库锁定在WAL模式下,只有读者

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)

sqlite concurrency system.data.sqlite

10
推荐指数
1
解决办法
3707
查看次数

Java中的通用方法参数的getClass()

以下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)

java generics reflection

9
推荐指数
2
解决办法
1932
查看次数

.NET:bool vs enum作为方法参数

每次我写一个带有表示选项的布尔参数的方法时,我发现自己在想:"我应该用枚举来替换它,这会使读取方法调用变得更容易吗?".

考虑以下一个对象,它接受一个参数来判断实现是否应该使用它的线程安全版本(我不是在这里问这样做这样做是不是好的设计,只是使用了布尔值):

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之间发生了什么.它已被淘汰,因为已经引入了第二个选项,并且整个事物已经转换为枚举.

虽然在有三个或更多元素的情况下使用枚举似乎很明显,但在这些特定情况下,您对使用枚举而不是布尔值有什么看法和经验?

.net code-design

7
推荐指数
1
解决办法
548
查看次数

我怎样才能获得System.Windows.Controls.Primitive.PopupRoot类型?

图片可以说出千言万语.

当我爬上可视树时,我看到最后一个父类型为System.Windows.Controls.Pimitives.PopupRoot 在此输入图像描述

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

在此输入图像描述

reflection wpf

7
推荐指数
2
解决办法
3009
查看次数

无法在C#中的列表框中执行键值

我正在使用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)

c# listbox winforms

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

压缩对象指针的目的是什么?

在我关于CLR是否可以使用压缩指针的问题之后,答案是它毫无意义.仍然有一些JVM正在实现它,所以这种优化的具体好处是什么,因为获得4个字节似乎不值得呢?

.net optimization 64-bit pointers jvm

6
推荐指数
1
解决办法
689
查看次数