采用 Callable 的 Xamarin Executor

Xamarin Executor that takes Callable

第一部分

您好,我正在尝试更改以下代码以使用 Callable 而不是 可运行,因为我希望将提供给执行程序的功能 return 数据.

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# 中复制代码时 主要的 class Callable 丢失了,只有 ICallable 我不能 实例化。不幸的是,Xamarin 文档还提供了 Java 个示例!

如果有人能提供帮助,我将不胜感激!

第二部分

完整的设计思想是一个服务,有这个嵌入式执行器到运行 任务顺序。顺序执行是至关重要的,因为服务 将与蓝牙接口有持续的套接字连接,并且只有 一次可以处理一个蓝牙请求(任务)。最初我想使用 IntentService 但我希望服务在 应用程序,否则对于每个蓝牙请求,套接字都必须 重新连接。

对于设计方法的任何建议也将不胜感激!

ICallableIFuture 的 C# 示例 return 与您提供的字符串相同...

实施基于 ICallable 的 class:

Call() 方法中执行计算并 return 结果,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>("Whosebug");
    futures.Push(executor.Submit(br));
}
while (futures.Count > 0)
{
    Console.WriteLine(futures.Pop().Get());
}