c#将方法委托给Java和异步处理
本文关键字:Java 异步 处理 方法 | 更新日期: 2023-09-27 18:16:33
我的任务是创建具有与下面代码类似功能的Java代码。目前,我正在努力理解代码的确切作用以及如何在Java中模拟效果。
#region "Send Aggregate Event"
/// <summary>
/// Delegate for async sending the AggregateEvent
/// </summary>
/// <param name="request"></param>
public delegate void SendAggregateEventAsync(AE request);
SendAggregateEventAsync _sendAggregateEventAsync;
/// <summary>
/// IAsyncResult pattern to async send the AggregateEvent
/// </summary>
/// <param name="request"></param>
/// <param name="callback"></param>
/// <param name="state"></param>
/// <returns></returns>
public IAsyncResult BeginSendAggregateEvent(AE request, AsyncCallback callback, Object state)
{
_sendAggregateEventAsync = new SendAggregateEventAsync(SendAggregateEvent);
return _sendAggregateEventAsync.BeginInvoke(request, callback, state);
}
public void EndSendAggregateEvent(IAsyncResult result)
{
object state = result.AsyncState;
_sendAggregateEventAsync.EndInvoke(result);
}
/// <summary>
/// Send an aggregate event to the Device Webserver
/// </summary>
/// <param name="request">The AggregateEvent request</param>
public void SendAggregateEvent(AE request)
{
if (request == null) throw new ArgumentNullException("request");
String message = ChangeDatesToUTC(MessageHelper.SerializeObject( typeof(AE), request), new String[] { "EventTime" }, url);
SendMessage(message);
}
#endregion
还有其他几个事件,它们的代码都与上面提供的类似。从注释中,我了解到代码旨在异步处理SendAggregateEvent方法。我不明白的是为什么要使用委托修饰符,或者如何在Java中复制这种类型的异步处理。
也是从阅读这个线程
Java代表?
我明白在java中没有"简单"的方法来模拟委托功能。是否有必要使用委托功能来异步处理SendAggregateEvent方法?如果没有,谁能告诉我该怎么做?
这实际上是在c#中编写异步代码的旧方法,通常被称为异步编程模型
我对java不够熟悉,但是复制这段代码所需要的只是创建一个同步执行SendAggregateEvent
的方法和一个异步调用SendAggregateEventAsync
的方法
更具体地回答你的一些问题。委托只是用来封装SendAggregateEvent
方法,以便它和它的参数可以在一个可能不同的线程上调用(记住异步不一定是多线程的)
它是这样的:
var referenceToTaskBeingRun = BeginSomeMethod()
//the above wraps the actual method and calls it, returning a reference to the task
var results = EndSomeMethod(referenceToTaskBeingRun );
//the above sends the reference so that it can be used to get the results from the task.
//NOTE that this is blocking because you are now waiting for the results, whether they finished or not
现在做这件事的首选方法是使用任务并行库,它有一个更容易阅读的代码库。说了这么多,关注这段代码的关键是你只需要一个方法和那个方法的async版本。实现应该由您和您的编程堆栈决定。不要试图在不属于它的地方强制使用另一个堆栈的实现,特别是一个甚至不再是首选方法的实现。
根据Java的答案如何异步调用方法,FutureTask
是Java中异步运行方法的一种好方法。下面是一些异步运行任务的Java代码(参见http://ideone.com/ZtjA5C)
import java.util.*;
import java.lang.*;
import java.util.concurrent.FutureTask;
class Main
{
public static void main (String[] args) throws java.lang.Exception
{
System.out.println("Before");
ExecutorService executorService = Executors.newFixedThreadPool(1);
FutureTask<Object> futureTask = new FutureTask<Object>(new Runnable() {
public void run()
{
System.out.println("Hello async world!");
}
}, null);
System.out.println("Defined");
executorService.execute(futureTask);
System.out.println("Running");
while (!futureTask.isDone())
{
System.out.println("Task not yet completed.");
try
{
Thread.sleep(1);
}
catch (InterruptedException interruptedException)
{
}
}
System.out.println("Done");
}
}