本文整理汇总了C#中Chromium.Remote.RemoteConnection.EnqueueWrite方法的典型用法代码示例。如果您正苦于以下问题:C# RemoteConnection.EnqueueWrite方法的具体用法?C# RemoteConnection.EnqueueWrite怎么用?C# RemoteConnection.EnqueueWrite使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Chromium.Remote.RemoteConnection
的用法示例。
在下文中一共展示了RemoteConnection.EnqueueWrite方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: ExecutionThreadEntry
private void ExecutionThreadEntry(RemoteConnection connection)
{
if(returnImmediately) {
// only happens in calls from the browser to the renderer
CfxDebug.Assert(connection == RemoteClient.connection);
ExecuteInTargetProcess(connection);
return;
}
if(RemoteClient.connection == null) {
if(!CfxRemoteCallbackManager.IncrementCallbackCount(connection.remoteProcessId)) {
// The application has suspended remote callbacks.
// Write the response without ececuting event handlers, returning default values.
connection.EnqueueWrite(WriteResponse);
return;
}
}
var threadContext = new CfxRemoteCallContext(connection, remoteThreadId);
threadContext.Enter();
var threadStackCount = CfxRemoteCallContext.ContextStackCount;
try {
ExecuteInTargetProcess(connection);
} finally {
if(RemoteClient.connection == null) {
CfxRemoteCallbackManager.DecrementCallbackCount(connection.remoteProcessId);
}
if(threadStackCount != CfxRemoteCallContext.ContextStackCount || CfxRemoteCallContext.CurrentContext != threadContext) {
CfxRemoteCallContext.resetStack(threadStackCount - 1);
throw new CfxException("Unbalanced remote call context stack. Make sure to balance calls to CfxRemoteCallContext.Enter() and CfxRemoteCallContext.Exit() in all render process callback events.");
}
threadContext.Exit();
}
connection.EnqueueWrite(WriteResponse);
}
示例2: RequestExecution
internal void RequestExecution(RemoteConnection connection)
{
if(CfxRemoteCallContext.IsInContext && CfxRemoteCallContext.CurrentContext.connection != connection) {
// The thread is in a remote call context, but the requestor wants to call
// on another connection. This can happen if a CfrObject method from one connection
// is used within the scope of a callback from another connection.
// In this case, the call has to be made in a temporary context with remote thread id zero.
var ctx = new CfxRemoteCallContext(connection, 0);
ctx.Enter();
try {
RequestExecution(connection);
} finally {
ctx.Exit();
}
return;
}
if(returnImmediately) {
if(connection.ShuttingDown)
return;
else if(connection.connectionLostException != null)
throw new CfxRemotingException("Remote connection lost.", connection.connectionLostException);
connection.EnqueueWrite(WriteRequest);
return;
}
lock(waitLock) {
// The lock must begin here. Otherwise,
// there is a race between Wait and PulseAll
// causing this thread to wait forever
// under some circumstances.
localThreadId = System.Threading.Thread.CurrentThread.ManagedThreadId;
connection.callStack.Push(this);
remoteThreadId = CfxRemoteCallContext.currentThreadId;
connection.EnqueueWrite(WriteRequest);
for(; ; ) {
if(responseReceived) {
Debug.Assert(reentryCall == null);
return;
}
if(this.reentryCall != null) {
reentryCall.ExecutionThreadEntry(connection);
reentryCall = null;
}
if(!connection.ShuttingDown && connection.connectionLostException == null)
System.Threading.Monitor.Wait(waitLock);
if(connection.ShuttingDown)
return;
else if(connection.connectionLostException != null) {
if(RemoteClient.connection != null) {
// this is the render process calling back into the browser process
// reaching this point usually means the browser process crashed or was killed
// don't throw, just return so the process can exit gracefully
return;
}
throw new CfxRemotingException("Remote connection lost.", connection.connectionLostException);
}
}
}
}