Xamarin Executor, который принимает Callable

Часть I

Привет, я пытаюсь изменить следующий фрагмент кода, чтобы использовать Callable вместо Runnable, потому что я хочу, чтобы функции, которые передаются исполнителю, возвращали данные.

using Android.App;
using Android.OS;
using Android.Widget;
using Java.Util.Concurrent;
using Java.Lang;

namespace ServiceExecutor {
    [Activity(Label = "SomeActivity")]
    public class SomeActivity : Activity {
        TextView tv1;

        Runnable r;            
        static IExecutorService exe = Executors.NewSingleThreadExecutor();        

        protected override void OnCreate(Bundle savedInstanceState) {
            base.OnCreate(savedInstanceState);

            tv1 = FindViewById<TextView>(Resource.Id.textView1);

            for (int i = 0; i < 4; i++) {
                r = new Runnable(() => function(i));
                exe.Submit(r);
            }
        }

        public void function(int i) {
            RunOnUiThread(() => tv1.Text += "function " + i.ToString() + "\r\n");
            Thread.Sleep(2000);
        }    
    }
}

Я нашел примеры на Java, но когда я пытаюсь воспроизвести код на С#, основной класс Callable отсутствует, и есть только ICallable, экземпляр которого я не могу создать. К сожалению, документация Xamarin также содержит примеры Java!

Я был бы признателен, если бы кто-нибудь мог помочь!

Часть II

Полная идея дизайна — это служба, в которой есть встроенный исполнитель для последовательного запуска задач. Последовательное выполнение имеет решающее значение, поскольку служба будет иметь постоянное соединение через сокет с интерфейсом Bluetooth, и одновременно может обрабатываться только один запрос (задача) Bluetooth. Изначально я хотел использовать IntentService, но я хочу, чтобы сервис был активен на протяжении всей жизни приложения, иначе для каждого запроса bluetooth сокету придется переподключаться.

Любые советы по подходу к дизайну также будут оценены!


person NikosD    schedule 19.01.2017    source источник


Ответы (1)


Пример С# ICallable и IFuture, который просто возвращает ту же строку, которую вы предоставили...

Реализуйте класс на основе ICallable:

В методе Call() вы выполняете свои вычисления и возвращаете результат, ExecutorService отвечает за вызов этого метода и сохранение результата.

public class BoomerangeCallable<T> : Java.Lang.Object, ICallable
{
    T value;
    public BoomerangeCallable(T value)
    {
        this.value = value;
    }
    public Java.Lang.Object Call()
    {
        return value.ToString();
    }
}

Пример использования:

var futures = new Stack<IFuture>();
var executor = Executors.NewSingleThreadExecutor();
for (int i = 0; i < 5; i++)
{
    var br = new BoomerangeCallable<string>("StackOverflow");
    futures.Push(executor.Submit(br));
}
while (futures.Count > 0)
{
    Console.WriteLine(futures.Pop().Get());
}
person SushiHangover    schedule 19.01.2017
comment
Большое спасибо, как вы думаете, мне следует избавиться от Java и остаться с реализацией .NET, такой как использование пула потоков? - person NikosD; 19.01.2017
comment
@NikosD Лично я стараюсь максимально избегать одноранговых объектов Java и оставаться на виртуальной машине C # .... Тем не менее, я бы хотел, чтобы в C # было что-то такое же простое в использовании, как ExecutorService ;-) То, как я сделал бы это, добавив Actions к BlockingCollection и потребляя/вызывая эти действия BlockingCollection в автономном потоке... - person SushiHangover; 20.01.2017