我在Windows 8 Release Preview上安装了Visual Studio 2012 RC,我的问题是有没有与Metro无关的任何有用的新功能,或者Metro是分离.Net 4和.Net 4.5?
我从Task.Run中捕获异常时遇到了问题.我更改了代码并解决了问题.我愿意弄清楚在这两种方式下处理Task.Run中的异常有什么区别:
在Outside函数中我无法捕获异常,但在Inside中我可以捕获它.
void Outside()
{
try
{
Task.Run(() =>
{
int z = 0;
int x = 1 / z;
});
}
catch (Exception exception)
{
MessageBox.Show("Outside : " + exception.Message);
}
}
void Inside()
{
Task.Run(() =>
{
try
{
int z = 0;
int x = 1 / z;
}
catch (Exception exception)
{
MessageBox.Show("Inside : "+exception.Message);
}
});
}
Run Code Online (Sandbox Code Playgroud) 我尝试使用以下代码在导航到下一个窗口之前延迟2秒.但线程首先调用,文本块显示一微秒并进入下一页.我听说调度员会这样做.
这是我的片段:
tbkLabel.Text = "two mins delay";
Thread.Sleep(2000);
Page2 _page2 = new Page2();
_page2.Show();
Run Code Online (Sandbox Code Playgroud) 我试图在WPF应用程序中使用以下方法.NET Framework 4 Client Profile但我收到此错误:
找不到类型或命名空间名称"async"
我在用
using System.Threading.Tasks;
Run Code Online (Sandbox Code Playgroud)
知道什么可能是错的吗?提前致谢
private async Task SumPageSizesAsync()
{
HttpClient client = new HttpClient();
Task<byte[]> getContentsTask = client.GetByteArrayAsync(url);
byte[] urlContents = await getContentsTask;
}
Run Code Online (Sandbox Code Playgroud)
我正在使用VS 2010
我们的WiX安装程序将.NET 4.0 WinForms应用程序部署到Windows Vista和7台桌面.该应用程序包括一个需要.NET补丁的可移植类库(KB2468871).我们需要安装补丁作为先决条件.有多种方法可以应用补丁:
使用类似问题的建议,我创建了一个CustomAction检查QFE(#1),我发现它在找到时返回true.
private static bool IsPatchAlreadyInstalled()
{
// If the patch is installed, we can find it using WMI
var query = new SelectQuery("SELECT HotFixID FROM Win32_QuickFixEngineering WHERE HotFixID = 'Q2468871' OR HotFixID = 'KB2468871'");
var results = new ManagementObjectSearcher(query).Get();
return results.Count > 0;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,由于补丁是作为工具(#2)的一部分安装的,因此在我的开发机器上失败了.我还没有目睹情况#3.
检测补丁是否已应用的更好方法是什么?
什么是.NET 4.0中await关键字的最佳替代方案?我有一个方法,需要在异步操作后返回一个值.我注意到wait()方法完全阻塞了线程,从而使异步操作无效.在释放UI线程的同时运行异步操作有哪些选择?
有人可以解释这两个陈述之间的区别:
Task<Task> bTask = backup.BackupCurrentDatabaseAsync()
.ContinueWith(_ => CompressArchiveAsync());
//unwrap the tasks to produce one entire task
Task t = bTask.Unwrap();
Run Code Online (Sandbox Code Playgroud)
VS
Task<Task> bTask = backup.BackupCurrentDatabaseAsync()
.ContinueWith(_ =>
{
CompressArchiveAsync();
});
//unwrap the tasks to produce one entire task
Task t = bTask.Unwrap();
Run Code Online (Sandbox Code Playgroud)
该方法ExtractArchiveAsync(),BackupCurrentDatabaseAsync(),RestoreDatabaseAsync()全部返回Task.
这里,第一个Continuation返回a Task<Task>.然后我可以Unwrap()将此任务放在结果(内部)任务上.
第二个版本不编译.这里唯一不同的是周围的牙箍CompressArchiveAsync().
我试图访问结果(内部)Task来检查Task.Status.如果我使用第二种方法,Task.Status将报告BackupCurrentDatabaseAsync()任务的结果.
C#5.0异步/等待构造非常棒,但遗憾的是,微软只展示了.NET 4.5和VS 2012的候选版本,这些技术将在我们的项目中得到广泛采用需要一些时间.
在Stephen Toub的异步方法,C#迭代器和任务中,我找到了一个可以在.NET 4.0中很好地使用的替代方法.还有十几个其他实现甚至可以在.NET 2.0中使用该方法,尽管它们看起来很少过时且功能较少.
所以现在我的.NET 4.0代码看起来像(注释部分显示它是如何在.NET 4.5中完成的):
//private async Task ProcessMessageAsync()
private IEnumerable<Task> ProcessMessageAsync()
{
//var udpReceiveResult = await udpClient.ReceiveAsync();
var task = Task<UdpAsyncReceiveResult>
.Factory
.FromAsync(udpClient.BeginReceive, udpClient.EndReceive, null);
yield return task;
var udpReceiveResult = task.Result;
//... blah blah blah
if (message is BootstrapRequest)
{
var typedMessage = ((BootstrapRequest)(message));
// !!! .NET 4.0 has no overload for CancellationTokenSource that
// !!! takes timeout parameter :(
var cts
= new CancellationTokenSource(BootstrapResponseTimeout); // Error here
//... …Run Code Online (Sandbox Code Playgroud) c# timeout pattern-matching task-parallel-library async-await
用户必须在其计算机上安装哪个版本的.NET才能让开发人员在C#5中使用更新的异步功能?
我有两个.net Task对象,我可能希望以parellel或顺序运行.在任何一种情况下,我都不想阻止线程等待它们.事实证明,Reactive Extensions让并行故事变得美妙.但是当我尝试按顺序排列任务时,代码可以工作,但感觉很尴尬.
我想知道是否有人可以展示如何使顺序版本更简洁或编码为并行版本毫不费力.没有必要使用反应式扩展来回答这个问题.
作为参考,这是我的两个并行和顺序处理解决方案.
这是纯粹的快乐:
public Task<string> DoWorkInParallel()
{
var result = new TaskCompletionSource<string>();
Task<int> AlphaTask = Task.Factory.StartNew(() => 4);
Task<bool> BravoTask = Task.Factory.StartNew(() => true);
//Prepare for Rx, and set filters to allow 'Zip' to terminate early
//in some cases.
IObservable<int> AsyncAlpha = AlphaTask.ToObservable().TakeWhile(x => x != 5);
IObservable<bool> AsyncBravo = BravoTask.ToObservable().TakeWhile(y => y);
Observable
.Zip(
AsyncAlpha,
AsyncBravo,
(x, y) => y.ToString() + x.ToString())
.Timeout(TimeSpan.FromMilliseconds(200)).Subscribe(
(x) => { result.TrySetResult(x); },
(x) => { result.TrySetException(x.GetBaseException()); }, …Run Code Online (Sandbox Code Playgroud) 我正在使用SignalR.Hub上的功能通常返回一个Task.我现在有一个函数可以添加一组连接.我想返回一个代表所有这些任务的任务.
我发现了一个完美的功能:Task.WhenAll.然而,这是.NET 4.5中的一项新功能,我仍然坚持使用.NET 4.
因此,我决定编写自己的版本,直到我们可以转到.NET 4.5.因为在涉及多线程时经常有一些警告(例如线程池的东西),我不确定我的实现是否正确:
public static Task WhenAll(IEnumerable<Task> tasks)
{
return Task.Factory.StartNew(() => Task.WaitAll(tasks.ToArray()));
}
Run Code Online (Sandbox Code Playgroud)
在功能上,我认为它可行,但是我不会为新任务获得额外的阻塞线程吗?或者这是不可避免的?
编辑:以下是我将如何与SignalR一起使用:
public static Task Add(this IGroupManager groupManager, string connectionId,
IEnumerable<string> groups)
{
return WhenAll(groups.Select(group => groupManager.Add(connectionId, group)));
}
Run Code Online (Sandbox Code Playgroud) c# ×11
.net ×6
async-await ×3
.net-4.5 ×2
asynchronous ×2
c#-5.0 ×2
wpf ×2
.net-4.0 ×1
asp.net-4.5 ×1
concurrency ×1
dispatcher ×1
task ×1
thread-sleep ×1
timeout ×1
windows ×1
wix ×1