小编Ned*_*nov的帖子

Task.Factory.StartNew vs new Task

有没有人知道做Task.Factory.StartNewvs new Task后跟调用Start任务之间是否有任何区别.看反射器似乎没有太大的区别.所以也许唯一的区别是Task.Factory.StartNew返回已经启动的任务.它是否正确?

我知道Task.Factory.StartNew并且Task.Run有不同的默认选项,Task.Run是.Net 4.5的首选选项.

c# asynchronous c#-4.0

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

在异步方法中ref和out参数

有谁知道为什么async不允许方法refout参数?我已经做了一些或研究它,但我唯一能找到的是它与堆栈展开有关.

c# asynchronous

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

我什么时候应该使用ConfigureAwait(true)

有没有人遇到使用场景ConfigureAwait(true)?由于true是默认选项,我无法看到你什么时候使用它.

c# asynchronous

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

为什么等待冷任务不会抛出

我只是在尝试看待Task等待冷任务(即尚未启动的)时会发生什么.令我惊讶的是,代码只是永远挂起而且"Finsihed "从未打印过.我希望抛出异常.

public async Task Test1()
{
    var task = new Task(() => Thread.Sleep(1000));
    //task.Start();
    await task;
}

void Main()
{
    Test1().Wait();
    Console.WriteLine("Finished");
}
Run Code Online (Sandbox Code Playgroud)

然后我或许可以从另一个线程启动任务,所以我将代码更改为:

public async Task Test1()
{
    var task = new Task(() => Thread.Sleep(1000));
    //task.Start();
    await task;

    Console.WriteLine("Test1 Finished");
}

void Main()
{
    var task1 = Test1();

    Task.Run(() => 
    {
        Task.Delay(5000);   
        task1.Start();
    });

    task1.Wait();
    Console.WriteLine("Finished");
}
Run Code Online (Sandbox Code Playgroud)

但它仍被阻止task1.Wait().有人知道在等待之后是否有办法开始冷却任务?

否则似乎没有必要能够执行await冷任务,所以也许任务应该在等待时启动或者应该抛出异常.

更新

我正在等待错误的任务,即返回的外部任务Test1而不是其中的新任务.@Jon Skeet提到的InvalidOperationException被抛入其中,Task.Run但是因为没有观察到生成的任务,所以主线程上没有抛出异常.将try/catch内部Task.Run或调用Wait() …

c# asynchronous async-await

11
推荐指数
1
解决办法
1093
查看次数

Monitor.Enter如何工作?

我一直在做一些调查,以确切了解Monitor.Enter如何在内部工作.我查看了代码,似乎进入的实际机制是在外部函数中:

[System.Security.SecuritySafeCritical]
[ResourceExposure(ResourceScope.None)]
[MethodImplAttribute(MethodImplOptions.InternalCall)]
private static extern void ReliableEnterTimeout(Object obj, int timeout, ref bool lockTaken);
Run Code Online (Sandbox Code Playgroud)

有谁知道这个函数做什么或Monitor.Enter的一般机制是什么?它是如何知道哪些对象被锁定的?

c# locking thread-safety

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

具有子图聚合的递归查询(任意深度)

我问一个问题前面关于沿着图形聚集量.提供的两个答案运作良好,但现在我正在尝试将Cypher查询扩展到可变深度的图表.

总结一下,我们从一堆叶子商店开始,这些叶子商店都与特定供应商相关联,这是Store节点上的一个属性.然后将库存移至其他商店,每个供应商的比例对应于他们对原始商店的贡献.

所以对于节点B02,S2贡献750/1250 = 60%S3贡献40%.然后,我们600台我们对B02其中60%属于S240%S3等.

在此输入图像描述

我们想知道最终700个单位的百分比D01属于每个供应商.供应商名称相同的供应商.因此,对于上图,我们期望:

S1,38.09
S2,27.61
S3,34.28

我使用这个Cypher脚本编写了一个图表:

CREATE (A01:Store {Name: 'A01', Supplier: 'S1'})
CREATE (A02:Store {Name: 'A02', Supplier: 'S1'})
CREATE (A03:Store {Name: 'A03', Supplier: 'S2'})
CREATE (A04:Store {Name: 'A04', Supplier: 'S3'})
CREATE (A05:Store {Name: 'A05', Supplier: 'S1'})
CREATE (A06:Store {Name: 'A06', Supplier: 'S1'})
CREATE (A07:Store {Name: 'A07', Supplier: 'S2'})
CREATE (A08:Store …
Run Code Online (Sandbox Code Playgroud)

recursion neo4j cypher

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

反应性扩展滑动时间窗口

我有一系列的股票报价,我想在过去一小时内获取所有数据并对其进行一些处理.我试图用反应式扩展2.0实现这一点.我在另一篇文章中读到使用Interval,但我认为这已被弃用.

c# system.reactive

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

ConfigureAwait(false)仍然是死锁

我一直在阅读,async/await并试图通过调用WebClient.DownloadStringTaskAsyncUI线程然后task.Result在任务执行时调用UI线程来重现Windows窗体中的死锁场景.这导致了僵局.

然后我尝试通过调用ConfigureAwait(false)返回的任务来解决这个问题,但令我惊讶的是仍然造成了死锁.我的理解是它应该在不同的线程上执行方法的延续,因此不应该有死锁.我错过了什么?

我知道如何解决这个问题,但是思想ConfigureAwait(false)也会解决它.

这是代码,我使用的是.NET 4.5

    private async void button1_Click(object sender, EventArgs e)
    {
        // Deadlocks!
        Task<string> task = DownloadAsync();
        textBox1.Text = task.Result;

        // Works
        //textBox1.Text = await DownloadAsync();
    }

    private static async Task<string> DownloadAsync()
    {
        var client = new WebClient();

        string result = await client.DownloadStringTaskAsync("http://www.rpmglobal.com").ConfigureAwait(false);          

        return result;
    }
Run Code Online (Sandbox Code Playgroud)

c# asynchronous async-await

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

Kotlin相当于C#Task.WhenAll

有没有Kotlin相当于C#的任务.什么时候?

我想出了下面的代码,但我想知道是否可以编写whenAll它只能暂停一次.

fun main(args: Array<String>) = runBlocking {
    println("Start")
    val serviceA = KotlinServiceA()
    val serviceB = KotlinServiceB()

    val deferredA = async(CommonPool) { serviceA.operationA() }
    val deferredB = async(CommonPool) { serviceB.operationB() }

    var tasks = arrayOf(deferredA, deferredB)
    tasks.whenAll()

    println("End")
}

suspend fun Array<Deferred<Unit>>.whenAll() : Unit {
    for (task in this) {
        task.await()
    }
}
Run Code Online (Sandbox Code Playgroud)

coroutine kotlin

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

将方法作为构造函数的参数传递

当我查看一些c#代码时,我发现了一个新的类声明,它传递了一个方法作为构造函数的参数.这是我第一次看到这样的东西,对我来说没什么意义.虽然整个应用程序工作正常我我仍然有兴趣知道幕后的主要想法是什么.

var c = new List<TheClass>
{
    new TheClass(TheMethod);
}

private void TheMethod()
{
    //do somthing
}
Run Code Online (Sandbox Code Playgroud)

c# constructor

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