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

Часть I

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

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, но когда я пытаюсь повторить код в C#, основной класс Callable отсутствует, и есть только ICallable, который я не могу создать. К сожалению, документация Xamarin также дает примеры Java!

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

Часть II

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

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

1 ответ

Решение

C# пример 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>("Stackru");
    futures.Push(executor.Submit(br));
}
while (futures.Count > 0)
{
    Console.WriteLine(futures.Pop().Get());
}
Другие вопросы по тегам