我想创建所有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.
我在TPL上阅读了很多内容,并找出了我们可以使用取消机制的方法.但是我被WaitHandle困住了.
如果我想取消任务,我可以定义CancellationTokenSource并将其与任务一起传递,我可以使用ThrowIfCancellationRequested方法取消任务.
我的问题是当我需要使用WaitHandle进行取消时,以及为什么简单的取消在这种情况下无效?
编辑 MSDN链接:http://msdn.microsoft.com/en-us/library/dd997364 ..看看使用WaitHandle听...
刚刚学习TPL ..
请帮忙..
在我的WPF应用程序中,我Dispatcher.BeginInvoke在构造函数中使用加载内容.我的问题是它会阻止UI线程吗?
或者是否更好地使用Task.Factory.StartNew然后在UI上调度回来,以便无论加载内容处理时间如何,应用程序都将首先加载?
哪种方法更好,为什么?
今天我遇到了一个错误,应用程序开始抛出多个异常(多个消息框).应用程序使用DispatcherUnhandledException.
在调查时我发现,如果转换器的参数为NULL,那么用于格式化dataGrid中日期和时间的转换器会抛出FormatException.
在任何情况下都建议从转换器中抛出异常吗?
刚才我已经发布了这个问题涉及到在客户端或服务应用异步等待.在继续讨论这个问题之前,请先阅读问题,因为它与问题紧密相关.
根据答案我已经测试了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) 我已经按照实施动态的数据网格这个链接.
我正在使用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呢?
我怀疑何时使用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
我写了以下代码:
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) 我已经创建了一个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)
请指导.
我想获得Windows服务的路径,
var managementObjectSearcher = new ManagementObjectSearcher("Select * from Win32_Service where serviceName = MyService");
Run Code Online (Sandbox Code Playgroud)
这段代码是由其他一些服务的构造函数编写的......
当系统启动并运行时,一切正常,但是如果我重新启动系统,则为此调用设置StopWatch类,并显示它显示该服务因此调用而需要35-45秒才能启动.
任何提高系统重启性能的建议......
我正在创建自定义控件,如果其中一个Dependency属性更改,我需要更新布局.我可以使用FrameworkMetadataProperty.AffectsMeasure或 FrameworkMetadataProperty.AffectsArrange.
问题1 - 我很困惑使用哪一个.
此外,我还可以使用UpdateLayout和InvalidateVisual方法来更新UI.
Q.2 - 所有这四件事看起来很相似,并且在使用哪一件时感到困惑?