TTask[n] EThreadNameException

TTask[n] EThreadNameException

专家们,请看下面的代码片段:

var
  aAllTasks : Array [0..1] of ITask  //global private var

Procedure SetImage();
begin

  //..      
  //.. Get a URL of an image stored on a server     
  //..

  aAllTasks[0] := TTask.Run(
    Procedure
    begin
      // Download the Image and display the image
    end);

  aAllTasks[1] := TTask.Run(
    Procedure
    begin
      // Get the rating of the image from a REST server
    end);

end;

当调试器命中时

      aAllTasks[1] := TTask.Run(...);

我明白了

$001A30B5 的第一次机会异常。异常 class EThreadNameException,消息为“”。进程 APPNAME (126391)

它抛出异常但它似乎没有使应用程序崩溃

这仅在 debugging/running iOS 个应用程序时发生
iOS 9.2
RS 10 西雅图(更新 1)
PA 服务器 17.0(带有修补程序..V 8.0.1.52)
Xcode 版本 7.2 (7C68)

什么会导致这种情况,我该如何解决?

您的代码调用 TThread.NameThreadForDebugging。看起来像这样:

class procedure TThread.NameThreadForDebugging(AThreadName: string; AThreadID: TThreadID);
{$IF Defined(MSWINDOWS)}
.... // windows specific code removed
{$ELSE MSWINDOWS}
const
  cExceptionMessage = 'Type=00,Name=%s,ThreadID=%d,Flags=0';
  EMBDBKPRESENTNAME = 'EMB_DBK_PRESENT';
{$IF Defined(MACOS)}
  OLDEMBDBKPRESENTNAME = 'EMB_MACOSX_DBK_PRESENT';                                                                             
{$ENDIF}
begin
{$IF Defined(MACOS)}
  if (getenv(EMBDBKPRESENTNAME) <> nil) or (getenv(OLDEMBDBKPRESENTNAME) <> nil) then
{$ELSEIF Defined(ANDROID)}
  if (System.DebugHook <> 0) or (getenv(EMBDBKPRESENTNAME) <> nil) then
{$ELSE}
  if (getenv(EMBDBKPRESENTNAME) <> nil) then
{$ENDIF}
  begin
    try
      raise EThreadNameException.Create(
        Format(cExceptionMessage, [AThreadName, AThreadID]));
    except
    end;
  end;
end;
{$ENDIF !MSWINDOWS}

当您希望为线程命名时调用此函数。现在,线程对象没有名称。因此,当您为线程命名时,它仅用于调试目的。调试器会跟踪您提供的名称,并将它们与线程 ID 相关联。然后,当调试器显示有关线程的信息时,它可以从 ID 中查找名称并将其显示给您。但这纯粹是一种调试器机制,因为操作系统不支持线程名称。

那么,您如何向调试器发出您希望为线程命名的信号。好吧,你抛出一个特定的异常。调试器知道异常并获得第一个处理异常的机会。调试器收到异常文本中的名称和线程 ID,并记下该信息。

请注意,异常会立即被吞噬,因此不会中断程序的运行。

所以,这个异常被抛出,由调试器处理,是正常的,不会影响程序的行为。奇怪的是调试器中断了那个异常。默认情况下,我希望调试器忽略该异常。

OSX 的旧 QC 报告 (QC#105310) 准确描述了您观察到的行为。该问题已关闭并标记为已在 XE7 中修复。也许这个问题已经重新浮出水面,或者它可能从未针对移动平台得到解决。我建议您向 Quality Portal 提交错误报告。