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和异步处理

这实际上是在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");
    }
}