小编Lea*_*ner的帖子

WeakReference了解

我想创建所有ViewModel的字典.

   public static Dictionary<string, WeakReference> vmCollection = new Dictionary<string, WeakReference>();
Run Code Online (Sandbox Code Playgroud)

像这样添加它

 vmCollection.Add(name, new WeakReference(viewModel));
Run Code Online (Sandbox Code Playgroud)

并调用这样的必需方法..

((vmCollection[viewModel].Target) as BaseViewModel).NewMessage(message);
Run Code Online (Sandbox Code Playgroud)

我需要保持它WeakReference吗?如果我不把它作为一个例子,可能会有什么后果WeakReference.

c# wpf weak-references

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

使用WaitHandle取消

我在TPL上阅读了很多内容,并找出了我们可以使用取消机制的方法.但是我被WaitHandle困住了.

如果我想取消任务,我可以定义CancellationTokenSource并将其与任务一起传递,我可以使用ThrowIfCancellationRequested方法取消任务.

我的问题是当我需要使用WaitHandle进行取消时,以及为什么简单的取消在这种情况下无效?

编辑 MSDN链接:http://msdn.microsoft.com/en-us/library/dd997364 ..看看使用WaitHandle听...

刚刚学习TPL ..

请帮忙..

c# task-parallel-library

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

Dispatcher.BeginInvoke和Task.Factory.StartNew之间有什么区别

在我的WPF应用程序中,我Dispatcher.BeginInvoke在构造函数中使用加载内容.我的问题是它会阻止UI线程吗?

或者是否更好地使用Task.Factory.StartNew然后在UI上调度回来,以便无论加载内容处理时间如何,应用程序都将首先加载?

哪种方法更好,为什么?

c# wpf task-parallel-library

8
推荐指数
1
解决办法
5449
查看次数

转换器应该抛出任何异常吗?

今天我遇到了一个错误,应用程序开始抛出多个异常(多个消息框).应用程序使用DispatcherUnhandledException.

在调查时我发现,如果转换器的参数为NULL,那么用于格式化dataGrid中日期和时间的转换器会抛出FormatException.

在任何情况下都建议从转换器中抛出异常吗?

c# wpf

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

Async-Await的真正优势是什么?

刚才我已经发布了这个问题涉及到在客户端或服务应用异步等待.在继续讨论这个问题之前,请先阅读问题,因为它与问题紧密相关.

根据答案我已经测试了C#4.0(TPL)和C#5.0(Async - Await)的代码.我使用服务提供的方法的异步和同步版本来调用服务,并比较每种情况下使用的线程数.以下是我用于测试所用资源的代码:

主要方法

List<Task<string>> tasksList = new List<Task<string>>();
List<int> asyncThreads = new List<int>();
List<int> tplThreads = new List<int>();
Stopwatch watch = new Stopwatch();
watch.Start();

// Call the Async version of the method
for (int i = 0; i < 500; i++)
{
    tasksList.Add(GetNameFromServiceAsync("Input" + i.ToString(), asyncThreads));
}

Task.WaitAll(tasksList.ToArray());

watch.Stop();

foreach (var item in asyncThreads.Distinct())
{
    Console.WriteLine(item);
}

Console.WriteLine("(C# 5.0)Asynchrony Total Threads = " + asyncThreads.Distinct().Count());
Console.WriteLine(watch.ElapsedMilliseconds.ToString());

watch.Restart();

tasksList.Clear();

// Call the normal method
for (int i …
Run Code Online (Sandbox Code Playgroud)

c# performance async-await

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

任务内联 - 查询

我正在阅读有关Thread和Task之间差异的问题.我有这个链接阅读:MSDN上的任务调度程序.

但我对这一段感到困惑:

在某些情况下,当等待任务时,它可以在执行等待操作的线程上同步执行.这提高了性能,因为它可以通过利用已经阻塞的现有线程来防止需要额外的线程,否则.为防止由于重入引起的错误,只有在相关线程的本地队列中找到等待目标时才会发生任务内联.

我想了解突出显示的部分.而且,我的本地缓存和全局队列也有点混乱...我真的好奇了解TaskScheduler ...请帮忙..

.net task-parallel-library

5
推荐指数
1
解决办法
198
查看次数

UI不会更新ExpandoObject列表

我已经按照实施动态的数据网格这个链接.

我正在使用Converter来绑定值ExpandoObject.列显示了学校总单位等值.

Item      ItemCount DefaultSchool School1  School2 School3

X-Item    200       100           50       50      0
Run Code Online (Sandbox Code Playgroud)

学校可以随时动态添加.现在,如果我将School4添加到40个单位,我想从默认学校中扣除相同的内容(DefaultSchool = 60,School4 = 40).

我可以在转换器中进行此计算,而ItemsSource也会显示更新的值,但它不会反映在UI上.

我使用TextBox的LostFocus事件MyDataGrid.Items.Refresh,它确实更新了UI,但每次失去焦点时,UI也会闪烁,就像一个刷新的网页一样.

我只需要更新当前行.在我使用时ExpandoObject,我不能使用INotifyPropertyChanged(我相信?),那么在这种情况下最好的方法应该是什么?

那么我该如何更新UI呢?

c# wpf user-interface inotifypropertychanged expandoobject

5
推荐指数
1
解决办法
1201
查看次数

UI线程上的Dispatcher.Dispatch

我怀疑何时使用Dispatcher.Invoke从不同的线程更新UI上的内容.

这是我的代码......

public Window4()
    {
        InitializeComponent();
        this.DataContext = this;

      Task.Factory.StartNew(() => Test() );
    }

    private List<string> listOfString = new List<string>();

    public List<string> ListOfString
    {
        get { return listOfString; }
        set { listOfString = value; }
    }

    public void Test()
    {
        listOfString.Add("abc");
        listOfString.Add("abc");
        listOfString.Add("abc");
    }

 <Grid>
    <ListView ItemsSource="{Binding ListOfString}" />
</Grid>
Run Code Online (Sandbox Code Playgroud)

我在不同的线程上启动一个新任务,我是否需要使用Dispatcher.BeginInvoke来更新UI.

在这种情况下,它正在更新UI,但我已经看到一些场景,人们使用来自不同线程的Dispatcher.Invoke或BeginInvoke更新UI.

所以我的问题是我们必须这样做,为什么在这种情况下它工作正常.

感谢和问候,BHavik

c# wpf

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

取消时的任务状态

我写了以下代码:

CancellationTokenSource tokenSource = new CancellationTokenSource();
CancellationToken token = tokenSource.Token;

int i = 0;
Console.WriteLine("Calling from Main Thread {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);

Task t1 = new Task(() =>
{
    while (true)
    {
        try
        {
            token.ThrowIfCancellationRequested();
        }

        catch (OperationCanceledException)
        {
            Console.WriteLine("Task1 cancel detected");
            break;
        }

        Console.WriteLine("Task1: Printing: {1}", System.Threading.Thread.CurrentThread.ManagedThreadId, i++);
    }
}, token);

Task t2 = new Task(() =>
{
    while (true)
    {
        try
        {
            token.ThrowIfCancellationRequested();
        }

        catch (OperationCanceledException)
        {
            Console.WriteLine("Task2 cancel detected");
            break;
        }

        Console.WriteLine("Task2: Printing: {1}", System.Threading.Thread.CurrentThread.ManagedThreadId, i++);
    }
});

t1.Start(); …
Run Code Online (Sandbox Code Playgroud)

c# task-parallel-library

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

在客户端和服务中应用async-await之间的区别

我已经创建了一个WCF服务,并且它的操作包含和实现如下:

    [OperationContract]
    Task<string> GetName(string name);

   public async Task<string> GetName(string name)
    {
         await Task.Delay(5000);
         var task1 = Task<string>.Factory.StartNew(() =>
         {
             return "Your name is : " + name;
         });
         var result = await task1;
         return result;
        }
Run Code Online (Sandbox Code Playgroud)

现在我在客户端使用此服务并创建了客户端.

 ServiceReference1.Service1Client client = new ServiceReference1.Service1Client();
Run Code Online (Sandbox Code Playgroud)

它显示了我的实现的两种方法:GetName和GetNameAsync

我可以使用以下两种方式来访问该服务.

var result_GetName = await Task.Factory.StartNew(() => client.GetName("My Input"));
 var result_GetNameAsync = await client.GetNameAsync("My Input");
Run Code Online (Sandbox Code Playgroud)
  • Q.1这两种方法有什么区别吗?
  • Q.2是否建议在特定条件下使用其中一种?或者我可以随时使用它们中的任何一个.
  • Q.3对于第二个呼叫,我在两个地方(客户端 - 服务器)使用async-await,它有什么优势吗?

请指导.

c# wcf async-await

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

系统启动/重新启动时,WMI调用会花费太多时间

我想获得Windows服务的路径,

var managementObjectSearcher = new ManagementObjectSearcher("Select * from Win32_Service where serviceName = MyService");
Run Code Online (Sandbox Code Playgroud)

这段代码是由其他一些服务的构造函数编写的......

当系统启动并运行时,一切正常,但是如果我重新启动系统,则为此调用设置StopWatch类,并显示它显示该服务因此调用而需要35-45秒才能启动.

任何提高系统重启性能的建议......

.net c# performance wmi windows-services

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

影响测量或影响安排

我正在创建自定义控件,如果其中一个Dependency属性更改,我需要更新布局.我可以使用FrameworkMetadataProperty.AffectsMeasureFrameworkMetadataProperty.AffectsArrange.

问题1 - 我很困惑使用哪一个.

此外,我还可以使用UpdateLayout和InvalidateVisual方法来更新UI.

Q.2 - 所有这四件事看起来很相似,并且在使用哪一件时感到困惑?

c# wpf layout

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