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有什么关系呢?
我看到CancellationToken并且CancellationTokenSource都有IsCancellationRequestedgetter方法.大多数示例都传递CancellationToken给在内部执行的方法Task.它通过使用任何这些来看我,电话可以返回.如果我使用IsCancellationRequested的CancellationTokenSource,这将是一个问题吗?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) 如果我在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#需要一个静态Main(),一些模块(可能来自OS)调用Main而不创建对象但是为什么C++不适用?当然在C++中,main不是任何类的一部分.如何从我的应用程序的外部以两种不同的方式调用它们?
为什么C#主要不像C++那样主要,是不是因为C#刚刚引入(仅用于命名约定),因为方法应该以大写字母或某些或其他原因开头?