Загрузить файл на сервер Apache

TaskCompletionSource.Task сконструирован без какого-либо действия, и планировщик назначается при первом вызове ContinueWith(...) (из асинхронного программирования с реактивной платформой и параллельной библиотекой задач - часть 3 ).

К счастью, вы можете немного изменить поведение ожидания, выполнив собственный класс, полученный из INotifyCompletion, а затем используя его в шаблоне, подобном await SomeTask.ConfigureAwait(false), чтобы настроить планировщик, который задача должна начать использовать в OnCompleted(Action continuation) (из ждать чего-нибудь; ).

Вот использование:

    TaskCompletionSource source = new TaskCompletionSource();

    public async Task Foo() {
        // Force await to schedule the task on the supplied scheduler
        await SomeAsyncTask().ConfigureScheduler(scheduler);
    }

    public Task SomeAsyncTask() { return source.Task; }

Вот простая реализация ConfigureScheduler с использованием Метод расширения задачи с важной частью в OnCompleted:

public static class TaskExtension {
    public static CustomTaskAwaitable ConfigureScheduler(this Task task, TaskScheduler scheduler) {
        return new CustomTaskAwaitable(task, scheduler);
    }
}

public struct CustomTaskAwaitable {
    CustomTaskAwaiter awaitable;

    public CustomTaskAwaitable(Task task, TaskScheduler scheduler) {
        awaitable = new CustomTaskAwaiter(task, scheduler);
    }

    public CustomTaskAwaiter GetAwaiter() { return awaitable; }

    public struct CustomTaskAwaiter : INotifyCompletion {
        Task task;
        TaskScheduler scheduler;

        public CustomTaskAwaiter(Task task, TaskScheduler scheduler) {
            this.task = task;
            this.scheduler = scheduler;
        }

        public void OnCompleted(Action continuation) {
            // ContinueWith sets the scheduler to use for the continuation action
            task.ContinueWith(x => continuation(), scheduler);
        }

        public bool IsCompleted { get { return task.IsCompleted; } }
        public void GetResult() { }
    }
}

Вот рабочий пример, который будет компилироваться в качестве консольного приложения:

using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;

namespace Example {
    class Program {
        static TaskCompletionSource source = new TaskCompletionSource();
        static TaskScheduler scheduler = new CustomTaskScheduler();

        static void Main(string[] args) {
            Console.WriteLine("Main Started");
            var task = Foo();
            Console.WriteLine("Main Continue ");
            // Continue Foo() using CustomTaskScheduler
            source.SetResult(null);
            Console.WriteLine("Main Finished");
        }

        public static async Task Foo() {
            Console.WriteLine("Foo Started");
            // Force await to schedule the task on the supplied scheduler
            await SomeAsyncTask().ConfigureScheduler(scheduler);
            Console.WriteLine("Foo Finished");
        }

        public static Task SomeAsyncTask() { return source.Task; }
    }

    public struct CustomTaskAwaitable {
        CustomTaskAwaiter awaitable;

        public CustomTaskAwaitable(Task task, TaskScheduler scheduler) {
            awaitable = new CustomTaskAwaiter(task, scheduler);
        }

        public CustomTaskAwaiter GetAwaiter() { return awaitable; }

        public struct CustomTaskAwaiter : INotifyCompletion {
            Task task;
            TaskScheduler scheduler;

            public CustomTaskAwaiter(Task task, TaskScheduler scheduler) {
                this.task = task;
                this.scheduler = scheduler;
            }

            public void OnCompleted(Action continuation) {
                // ContinueWith sets the scheduler to use for the continuation action
                task.ContinueWith(x => continuation(), scheduler);
            }

            public bool IsCompleted { get { return task.IsCompleted; } }
            public void GetResult() { }
        }
    }

    public static class TaskExtension {
        public static CustomTaskAwaitable ConfigureScheduler(this Task task, TaskScheduler scheduler) {
            return new CustomTaskAwaitable(task, scheduler);
        }
    }

    public class CustomTaskScheduler : TaskScheduler {
        protected override IEnumerable GetScheduledTasks() { yield break; }
        protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued) { return false; }
        protected override void QueueTask(Task task) {
            TryExecuteTask(task);
        }
    }
}

1
задан Andy 20 July 2010 в 09:13
поделиться

1 ответ

Возможно, да.

Если вы используете Eclipse и подключаемый модуль ADT, вам просто нужно сделать следующее:

  • скопировать файл commons-fileupload-1.2.1.jar в корень вашего проекта.
  • Щелкните правой кнопкой мыши значок проекта, чтобы открыть его свойства.
  • перейдите в «Путь сборки Java»
  • нажмите «Библиотеки», а затем в «Добавить JAR»
  • выберите файл загрузки общих файлов и нажмите «ОК».

Теперь вы готовы к работе. ADT автоматически преобразует классы в файле jar в формат файла dex для использования в dalvik и вставит их в файл APK.

Если вам нужна документация по использованию библиотеки, просто следуйте руководству пользователя: http://commons.apache.org/fileupload/using.html

2
ответ дан 2 September 2019 в 22:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: