标签: task

在任务中继续处理异常的正确方法

请看下面的代码 -

static void Main(string[] args)
{
    // Get the task.
    var task = Task.Factory.StartNew<int>(() => { return div(32, 0); });

    // For error handling.
    task.ContinueWith(t => { Console.WriteLine(t.Exception.Message); }, 
        TaskContinuationOptions.OnlyOnFaulted);

    // If it succeeded.
    task.ContinueWith(t => { Console.WriteLine(t.Result); }, 
        TaskContinuationOptions.OnlyOnRanToCompletion);
    Console.ReadKey();
    Console.WriteLine("Hello");
}

private static int div(int x, int y)
{
    if (y == 0)
    {
        throw new ArgumentException("y");
    }
    return x / y;
}
Run Code Online (Sandbox Code Playgroud)

如果我在发布模式下执行代码,输出为"发生了一个或多个错误",一旦我点击"Enter"键,"Hello"也会显示.如果我在调试模式下运行代码,输出与但是在IDE中调试时,当控件执行该行时,会出现IDE异常消息("用户代码中未处理的异常")

throw new ArgumentException("y"); 
Run Code Online (Sandbox Code Playgroud)

如果我从那里继续,程序不会崩溃并显示与发布模式相同的输出.这是处理异常的正确方法吗?

.net c# task task-parallel-library

52
推荐指数
4
解决办法
5万
查看次数

从Android应用安装程序和主屏幕启动应用程序时的活动堆栈排序问题

仅出于测试目的,我允许通过URL下载和安装我的应用APK.下载到手机上后,可以使用Android应用安装程序启动它,用户可以选择将其安装到自己的设备上然后再运行.

考虑我们是否以上述方式下载并运行应用程序.我的应用中的主/启动器活动是登录页面(Activity A).一旦用户被认证,他们就被带到应用程序的主要区域,例如Activity B.所以现在这个任务的当前活动堆栈是A > B.

然后我按下手机上的主页按钮,然后进入Android主屏幕.我通过菜单中的图标重新启动我的应用程序,我被带到了Activity A,而不是Activity B.活动堆栈现在是A > B > A,或者现在有两个单独的任务与活动堆栈A > B,A分别.我想要的是Activity B在我重新启动应用程序时被收回.在这种状态下按回来将带我回去Activity B.

如果我首先通过安装程序打开应用程序,而不是通过主屏幕/菜单打开应用程序,则只会发生这种不良行为.

我研究了各机制如何开展活动.当我们使用app安装程序时,我们会看到以下日志:

INFO/ActivityManager(XXXX): Starting activity: Intent { dat=file:///mnt/sdcard/download/[my app].apk cmp=com.android.packageinstaller/.InstallAppProgress (has extras) }
INFO/ActivityManager(XXXX): Starting activity: Intent { act=android.intent.action.MAIN flg=0x10000000 cmp=[my package]/[Activity A] }
Run Code Online (Sandbox Code Playgroud)

通过发射器/主屏幕:

INFO/ActivityManager(XXXX): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=[my package]/[Activity A] }
Run Code Online (Sandbox Code Playgroud)

当使用安装程序启动时,我们看到它正在使用标志0x10000000,但是当启动器启动时,我们看到它正在使用0x10200000.它也使用意图类别.

从 …

flags android task android-intent android-activity

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

为什么Task <T>不是共变体?

class ResultBase {}
class Result : ResultBase {}

Task<ResultBase> GetResult() {
    return Task.FromResult(new Result());
}
Run Code Online (Sandbox Code Playgroud)

编译器告诉我它不能隐式转换Task<Result>Task<ResultBase>.有人可以解释为什么会这样吗?我希望协方差可以让我以这种方式编写代码.

c# task covariance

50
推荐指数
2
解决办法
4354
查看次数

应用程序始终从根活动开始,而不是恢复背景状态(已知错误)

我正面临这些链接中提到的问题:

http://code.google.com/p/android/issues/detail?id=2373

http://groups.google.com/group/android-developers/browse_thread/thread/77aedf6c7daea2ae/da073056831fd8f3?#da073056831fd8f3

http://groups.google.com/group/android-developers/browse_thread/thread/2d88391190be3303?tvc=2

我有一个简单的根活动与LAUNCHER和MAIN意图,没有别的.我开始另一个活动,在清单中没有任何标志或任何额外东西.

我启动应用程序(root活动),然后从那里开始第二个活动.按Home(主页)按钮后,任务将进入后台.在再次启动应用程序时(从Launcher或按住最近应用程序的Home按钮),它会在现有堆栈的顶部启动根活动的新实例.

如果我按下后退按钮,新的"root"活动将关闭,旧的第二个活动将可见,这意味着它将在同一任务中启动根活动,而不是将任务带到前台.

为了解决这个问题,我做了root活动的启动模式singleTask.现在,当我按下主页并再次启动应用程序时,它会清除旧的根任务上方的活动,并将旧的根任务带到前台,而不是仅将第二个活动的整个旧任务放在最前面.请注意,旧的根任务仍保留其应用程序状态,这意味着它不是新实例,但已杀死较高的活动.

它甚至发生在从市场上下载的其他应用程序中.手动安装方法对我没有影响,它仍然以相同的方式启动.

resume android task android-activity

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

Celery任务运行更多任务

我正在使用celerybeat开始执行许多次要任务的主要任务.我已经写了两个任务.

有没有办法轻松做到这一点?Celery是否允许从任务中运行任务?

我的例子:

@task
def compute(users=None):
    if users is None:
        users = User.objects.all()

    tasks = []
    for user in users:
        tasks.append(compute_for_user.subtask((user.id,)))

    job = TaskSet(tasks)
    job.apply_async() # raises a IOError: Socket closed

@task
def compute_for_user(user_id):
    #do some stuff
Run Code Online (Sandbox Code Playgroud)

compute从celerybeat调用,但在尝试运行时会导致IOError apply_async.有任何想法吗?

python django task celery

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

等待Task.Delay()与Task.Delay().等待()

在C#中,我有以下两个简单的例子:

[Test]
public void TestWait()
{
    var t = Task.Factory.StartNew(() =>
    {
        Console.WriteLine("Start");
        Task.Delay(5000).Wait();
        Console.WriteLine("Done");
    });
    t.Wait();
    Console.WriteLine("All done");
}

[Test]
public void TestAwait()
{
    var t = Task.Factory.StartNew(async () =>
    {
        Console.WriteLine("Start");
        await Task.Delay(5000);
        Console.WriteLine("Done");
    });
    t.Wait();
    Console.WriteLine("All done");
}
Run Code Online (Sandbox Code Playgroud)

第一个示例创建一个打印"开始"的任务,等待5秒打印"完成",然后结束任务.我等待任务完成,然后打印"全部完成".当我运行测试时,它按预期运行.

第二个测试应该具有相同的行为,除了由于使用async和await而在Task内部等待应该是非阻塞的.但是这个测试只是打印"开始"然后立即"完成所有"和"完成"从未打印.

我不知道为什么我会得到这种行为:S非常感谢任何帮助:)

c# asynchronous task wait async-await

47
推荐指数
1
解决办法
7万
查看次数

在任务中等待异步/等待

我有这个构造main(),它创造了

var tasks = new List<Task>();

var t = Task.Factory.StartNew(
    async () =>
    {
        Foo.Fim();
        await Foo.DoBar();
    });

//DoBar not completed
t.Wait();
//Foo.Fim() done, Foo.DoBar should be but isn't
Run Code Online (Sandbox Code Playgroud)

但是,当我.Wait为t时,它不会等待呼叫DoBar()完成.我怎么让它实际等待?

.net c# task task-parallel-library async-await

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

System.Threading.Tasks - 限制并发任务的数量

我刚刚开始研究.Net 4.0中新的"System.Threading.Tasks"的好处,并且想知道是否有任何构建支持限制一次运行的并发任务的数量,或者是否应该手动处理.

EG:如果我需要调用100次计算方法,有没有办法设置100个任务,但只有5个同时执行?答案可能只是创建5个任务,调用Task.WaitAny,并在前一个任务完成时创建一个新任务.我只是想确保如果有更好的方法,我不会错过任何一招.

基本上,有没有内置的方法来做到这一点:

Dim taskArray() = {New Task(Function() DoComputation1()),
                   New Task(Function() DoComputation2()),
                   ...
                   New Task(Function() DoComputation100())}

Dim maxConcurrentThreads As Integer = 5
RunAllTasks(taskArray, maxConcurrentThreads)
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.

.net asp.net multithreading task

43
推荐指数
4
解决办法
3万
查看次数

.NET Task实例在运行期间是否超出范围?

如果我在方法中使用以下代码块(使用.NET 4和任务并行库):

var task = new Task(() => DoSomethingLongRunning());
task.Start();
Run Code Online (Sandbox Code Playgroud)

并且该方法返回,该任务是否超出范围并被垃圾收集,或者它将运行完成?我没有注意到GCing的任何问题,但是我想确保我没有为GC设置竞争条件.

.net c# garbage-collection task task-parallel-library

42
推荐指数
2
解决办法
8587
查看次数

42
推荐指数
4
解决办法
6万
查看次数