小编Rot*_*eel的帖子

是否重载版本的Task.WaitAny取消任务?

int WaitAny(Task[] tasks, int millisecondsTimeout); 
Run Code Online (Sandbox Code Playgroud)

上述方法是否在超时后取消了该任务?看起来它没有,但C#70-483考试参考书说这个重载版本取消任务.这是一些测试代码,

Task longRunning = Task.Run(() =>
{
    Thread.Sleep(10000);
});
int index = Task.WaitAny(new Task[] { longRunning }, 1000); // returns -1
index = 0; // reset it to reuse in the loop
while (index < 12)
{
    Thread.Sleep(1000);
    index++;
    Console.WriteLine("long running task status {0}", longRunning.Status);
}
Run Code Online (Sandbox Code Playgroud)

前几次,状态正在运行,之后状态更改为RanToCompletion.那么那个超时与Task和WaitAny有什么关系呢?

c# multithreading

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

我应该使用CancellationTokenSource还是CancellationToken来取消.NET中的任务

我看到CancellationToken并且CancellationTokenSource都有IsCancellationRequestedgetter方法.大多数示例都传递CancellationToken给在内部执行的方法Task.它通过使用任何这些来看我,电话可以返回.如果我使用IsCancellationRequestedCancellationTokenSource,这将是一个问题吗?ThrowIfCancellationRequested如果有取消请求,我应该抛出异常(通过使用)或只是从方法返回,如下面的代码所示?

class Program
{
    //If CancellationToken is passed then it behaves in same way?
    public static int TaskMethod(CancellationTokenSource tokenSource)
    {
        int tick = 0;
        while (!tokenSource.IsCancellationRequested)
        {
            Console.Write('*');
            Thread.Sleep(500);
            tick++;
            //token.Token.ThrowIfCancellationRequested();
        }
        //Should I just return or use ThrowIfCancellationRequested?
        return tick;
    }

    public static void Main()
    {
        CancellationTokenSource tokenSource = new CancellationTokenSource();
        CancellationToken token = tokenSource.Token;
        Task<int> task = Task.Factory.StartNew<int>(() => TaskMethod(tokenSource));
        Console.WriteLine("Press enter …
Run Code Online (Sandbox Code Playgroud)

c# task task-parallel-library

5
推荐指数
2
解决办法
3910
查看次数

使用Thread.Sleep解决锁定死锁问题

如果我在Thread.Sleep(0)方法中注释或传递0,那么就没有死锁.在其他情况下,存在僵局.uptask由线程轮询中的线程执行,这需要一些时间.同时,主线程获取lockB,lockA并打印字符串并释放锁.之后uptask开始运行,它看到lockA和lockB是免费的.所以在这种情况下没有死锁.但是如果我在平均时间内uptask进入主线程并且看到lockB被锁定并且发生了死锁.任何人都可以更好地解释或验证这是否是原因?

class MyAppClass
{
    public static void Main()
    {
        object lockA = new object();
        object lockB = new object();
        var uptask = Task.Run(() =>
        {
            lock (lockA)
            {
                lock (lockB)
                {
                    Console.WriteLine("A outer and B inner");
                }
            }
        });
        lock (lockB)
        {
            //Uncomment the following statement or sleep with 0 ms and see  that there is no deadlock.
            //But sleep with 1 or more lead to deadlock. Reason?
            Thread.Sleep(1);
            lock (lockA)
            { …
Run Code Online (Sandbox Code Playgroud)

c# multithreading

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

为什么C#具有静态Main()但C++没有静态main

出于好奇,C#需要一个静态Main(),一些模块(可能来自OS)调用Main而不创建对象但是为什么C++不适用?当然在C++中,main不是任何类的一部分.如何从我的应用程序的外部以两种不同的方式调用它们?

为什么C#主要不像C++那样主要,是不是因为C#刚刚引入(仅用于命名约定),因为方法应该以大写字母或某些或其他原因开头?

c# c++

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

标签 统计

c# ×4

multithreading ×2

c++ ×1

task ×1

task-parallel-library ×1