ric*_*ard 67 .net multithreading definition language-interoperability marshalling
我知道至少在这里已经提出了这个问题.
但是没有一个令人满意的答案,至少对我没有.关于与非托管代码的互操作,有很多关于编组的讨论,但是从一个线程到另一个线程的编组呢,就像我们在.NET中必须做的那样.
这让我问,什么是编组,真的吗?当您给出编组的定义时,您将如何定义它以便解释互操作性的情况,以及您在线程之间"编组"的情况?
Ira*_*ter 84
计算通常需要将数据从一个站点移动到另一个站点,并且没有任何共享内存.因此,一个计算将包含数据的消息发送给另一个.
如果数据是任意复杂的,那么该数据应如何在消息中发送?
编组是将数据字段或整组相关结构转换为可在消息中发送的序列化字符串的过程.如果消息格式必须是文本,要编组二进制数,可以将其转换为十六进制数字字符串.如果消息将携带二进制数据,则二进制数可能被转换为4个小端标准化二进制字节并以此方式发送.指针更难; 通常必须将它们转换为独立于实际存储器位置的抽象引用(例如,"节点号").
当然,如果你"编组"数据,你必须最终"解组",这是读取串行流和重建传输数据(结构)的过程.
通常在库中有(un)编组例程用于实现此目的,有时甚至有工具可以制作(un)编组例程所需的所有调用来发送/接收数据.
Ree*_*sey 29
编组正在采集某种形式的数据,并将其翻译成单独的形式.这是一个非常通用的术语,在许多地方使用,意义上有细微差别.
例如,在.NET中,当您使用本机类型时,互操作层将您的数据从.NET类型"编组"到适当的表单中以调用本机方法,然后将结果"编组"回来.
至于线程之间的"编组" - 通常,您需要让代码在与当前线程不同的线程上运行.例如,如果您使用的是Windows窗体,则无法更改线程池线程上的UI元素,因此您需要将调用"封送"回UI线程.这是通过创建委托,并通过Control.Invoke(使用相当复杂的系统将其发回到正确的同步上下文)将委托传递回用户界面线程来完成的,而后者又在用户界面上运行委托线程给你.
nla*_*ker 12
维基百科的定义实际上非常好.
编组的整体概念与"序列化:"从内存表示(在某种程度上,根本就没有任何表示 - 当某些东西在内存中它只是"存在")移动到"硬拷贝"时相同"表示,无论是XML还是二进制流或其他东西.但是,根据您正在做的事情,它还可能意味着某种转换或转换为目标格式.
对于进程编组:一个线程不是简单地"调用"另一个线程 - 数据必须打包并从一个线程"发送"到另一个线程.编组是打包数据的过程(例如,有关要调用的方法及其参数的数据).
如果您正在使用interop进行编组,那么您将方法调用及其参数打包到一个数据结构中,该数据结构可以发送到运行COM组件的进程/线程.该包需要采用COM组件可以理解的格式.
编组(类似于序列化)是将对象的内存表示形式转换为适合存储或传输的数据格式的过程。通常在必须在计算机程序的不同部分之间或从一个程序到另一个程序之间移动数据时使用。
在从.NET调用非托管函数的情况下,将通过编组将.NET的数据转换为非托管函数可以使用的数据。例如,System.String
基于Unicode,但是该字符串可能需要转换为ANSI字符串才能传递给非托管C函数。
对于线程,编组通常是指将某些数据的所有权从一个线程转移到另一个线程。例如,一个程序有两个线程。第一个线程从网络读取数据,第二个线程计算该数据。网络线程读取某些数据后,它将数据传输(即“封送”)到计算线程进行处理。它可以通过将数据写入两个线程之间共享的队列中来实现。
线程中的编组几乎总是涉及被编组数据的同步。
我对编组的理解是,它为您提供了一种在各种操作环境中以一致的方式传输数据的方法。
在将数据从托管代码编组到非托管代码的上下文中,它或多或少是相同的。
我有一些数据,比如一个整数数组或我选择的任何数据类型,我想让它在我的 C++ 代码对其进行一些操作之后在我的 C# 代码中使用。
我不能只是对 C# 代码说“嘿,这是数组所在的位置,做你想做的事”。C++ 中的整数数组的存储方式可能与 C# 中的不同。编组让我们以独立于环境的方式传输这些数据,以便任何一方都能以完全相同的方式查看数据。
另一个例子是网络。您通常不称此为封送处理,但是如果您想通过网络传输它,您通常必须以这样一种方式传输它,即接收它的人以与您相同的方式解释数据。您的计算机可以以小端顺序表示数据,而另一台可以以大端顺序表示数据。
tl;dr:编组为您提供了一种在各种操作环境中一致表示数据的方法
归档时间: |
|
查看次数: |
39699 次 |
最近记录: |