我之前没有使用过并发队列.
可以在while循环中使用如下所示的TryDequeue吗?难道这不会永远被卡住吗?
var cq = new ConcurrentQueue<string>();
cq.Enqueue("test");
string retValue;
while(!cq.TryDequeue(out retValue))
{
// Maybe sleep?
}
//Do rest of code
Run Code Online (Sandbox Code Playgroud) 我希望这不是滥用stackoverflow; 最近我在Parallel Extensions上看到了一些很棒的问题,引起了我的兴趣.
我的问题:你使用的是Parallel Extensions,如果有的话,怎么样?
我的名字是Stephen Toub,我是微软的并行计算平台团队的成员.我们是负责Parallel Extensions的小组.我一直很想知道开发人员如何利用Parallel Extensions(例如Parallel.For,PLINQ,ConcurrentDictionary等),积极的体验,你曾经拥有的负面体验,对未来的特征要求等等.上.
如果您愿意分享此类信息,请在此处作为对此问题的回复,或通过电子邮件私下给我stoub at microsoft dot com.
我非常期待收到你的来信.
提前致谢!
在.NET 4中,是否有任何功能等同于.NET 4.5的System.Threading.Tasks.Task.WhenAll()?
目标是将多个异步任务包装成一个在完成所有组成任务时完成的异步任务.
等待故障任务(具有异常集的任务)时,await将重新抛出存储的异常.如果存储的异常是a AggregateException,它将重新抛出第一个并丢弃其余的异常.
我们如何使用await并同时抛出原件AggregateException以便我们不会意外丢失错误信息?
注意,当然可以考虑使用hacky解决方案(例如,试一试await,然后调用Task.Wait).我真的希望找到一个干净的解决方案.这里最好的做法是什么?
我想过使用自定义awaiter,但内置TaskAwaiter包含很多魔法,我不知道如何完全重现.它调用TPL类型的内部API.我也不想重现所有这些.
如果你想玩它,这是一个简短的repro:
static void Main()
{
Run().Wait();
}
static async Task Run()
{
Task[] tasks = new[] { CreateTask("ex1"), CreateTask("ex2") };
await Task.WhenAll(tasks);
}
static Task CreateTask(string message)
{
return Task.Factory.StartNew(() => { throw new Exception(message); });
}
Run Code Online (Sandbox Code Playgroud)
只抛出两个例外中的一个Run.
请注意,Stack Overflow上的其他问题无法解决此特定问题.建议重复时请小心.
鉴于取消令牌,我想创建一个等待它的任务,这是永远不会完成但可以取消.我需要这样的模式,IMO应该很常见:
async Task DoStuff(Task t, CancellationToken ct)
{
// t was made from TaskCompletionSource,
// both t and ct are beyond my control
Task t2 = TaskFromCancellationToken(ct);
await Task.WhenAny(t, t2);
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
我到目前为止最好的想法是:
Task TaskFromCancelationToken(CancellationToken ct)
{
return Task.Delay(Timeout.Infinite, ct);
}
Run Code Online (Sandbox Code Playgroud)
是否有更好的方法来实现这种逻辑?
我正在开发一个Xamarin Forms移动应用程序,它有一个包含SearchBar,ListView和Map控件的页面.列表视图包含一个地址列表,这些地址在地图上反映为引脚.
当用户在SearchBar中键入时,ListView会自动更新(通过ViewModel绑定).过滤列表数据源的ViewModel方法看起来像这样......
void FilterList()
{
listDataSource = new ObservableCollection<location>(
locationData.Where(l => l.Address.Contains(searchBar.Text))
);
// ***** Now, update the map pins using the data in listDataSource
}
Run Code Online (Sandbox Code Playgroud)
我希望更新Map,因为ListView被过滤,但不是在每个按键上,因为这可能每秒发生多次.基本上,我想在更新Map之前在每个FilterList事件中进行"滚动暂停".在伪代码中......
// ***** Now, update the map pins using the data in listDataSource
if (a previously-requested map update is pending)
{
// Cancel the pending map update request
}
// Request a new map update in 1000ms using [listDataSource]
Run Code Online (Sandbox Code Playgroud)
可以使用可移植类库中提供的Stopwatch类来完成此操作,但我怀疑使用Tasks可以实现更清晰/更好的方法.
任何人都可以建议一个"更聪明" PCL兼容的方式来做到这一点?
c# mvvm task-parallel-library portable-class-library xamarin.forms
在单元测试组件时,我需要验证组件如何对在不同时间完成的任务做出反应.
我如何创建一个Task<>我可以随意解决的问题?
我正在尝试使用Task.WaitAll任务列表.事情是任务是异步lambda,Tasks.WaitAll因为它永远不会等待.
这是一个示例代码块:
List<Task> tasks = new List<Task>();
tasks.Add(Task.Factory.StartNew(async () =>
{
using (dbContext = new DatabaseContext())
{
var records = await dbContext.Where(r => r.Id = 100).ToListAsync();
//do long cpu process here...
}
}
Task.WaitAll(tasks);
//do more stuff here
Run Code Online (Sandbox Code Playgroud)
这不会因为异步lambda而等待.那我该如何等待我的lambda中的I/O操作呢?
有一个Task变量,让我们说现在正在运行任务..通过执行以下行.
await _task;
Run Code Online (Sandbox Code Playgroud)
我想知道当我编写这段代码时会发生什么:
await _task;
await _task;
Run Code Online (Sandbox Code Playgroud)
它会执行两次任务吗?或抛出异常,因为它已经运行?
.net c# parallel-processing asynchronous task-parallel-library
(这是对这个问题的新尝试,现在更好地证明了这个问题.)
假设我们有一个错误的任务(var faultedTask = Task.Run(() => { throw new Exception("test"); });),我们等待它.await将解压缩AggregateException并抛出基础异常.它会抛出faultedTask.Exception.InnerExceptions.First().
根据源代码,ThrowForNonSuccess它将通过执行任何存储ExceptionDispatchInfo来执行此操作,可能是为了保留良好的堆栈跟踪.AggregateException如果没有,它将不会打开包装ExceptionDispatchInfo.
这个事实本身是令人惊讶的,因为我的文档指出,第一异常始终抛出:https://msdn.microsoft.com/en-us/library/hh156528.aspx?f=255&MSPPError=-2147217396事实证明,await即可AggregateException但是,抛出,这是没有记录的行为.
当我们想要创建代理任务并设置它的异常时,这就成了一个问题:
var proxyTcs = new TaskCompletionSource<object>();
proxyTcs.SetException(faultedTask.Exception);
await proxyTcs.Task;
Run Code Online (Sandbox Code Playgroud)
这将引发AggregateException而await faultedTask;将抛出测试异常.
如何创建我可以随意完成的代理任务,这将反映原始任务的异常行为?
最初的行为是:
await 将抛出第一个内部异常.Task.Exception.InnerExceptions.(这个问题的早期版本遗漏了这个要求.)这是一个总结了调查结果的测试:
[TestMethod]
public void ExceptionAwait()
{
ExceptionAwaitAsync().Wait();
}
static async Task ExceptionAwaitAsync()
{
//Task has multiple exceptions.
var faultedTask = Task.WhenAll(Task.Run(() …Run Code Online (Sandbox Code Playgroud) .net c# task-parallel-library async-await taskcompletionsource