Xamarin执行人,带走Callable



第一部分

嗨,我正在尝试更改以下代码,以使用Callable而不是可运行,因为我希望提供给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() + "rn");
Thread.Sleep(2000);
}    
}
}

我在Java中找到了一些例子,但当我试图用C语言复制代码时#主类Callable不见了,只有我不能的ICallable实例化。不幸的是,Xamarin文档也给出了Java示例!

如果有人能帮忙,我将不胜感激!

第二部分

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

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

ICallableIFuture的C#示例,仅返回您提供的相同字符串。。。

实现一个基于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());
}

相关内容

  • 没有找到相关文章

最新更新