Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Outlook:使用新扩展保存TFS-PBI会锁定PBI_C#_Tfs_Outlook - Fatal编程技术网

C# Outlook:使用新扩展保存TFS-PBI会锁定PBI

C# Outlook:使用新扩展保存TFS-PBI会锁定PBI,c#,tfs,outlook,C#,Tfs,Outlook,我正在尝试在outlook中创建一个新按钮,它查找任务ID,获取连接的PBI,并将邮件项添加为附件 很简单: public void mnuAttachToPBI_Clicked(Office.IRibbonControl control) { Microsoft.Office.Interop.Outlook.Selection sel = Global.CurrentApplication.ActiveExplorer().Selection; if (sel != nul

我正在尝试在outlook中创建一个新按钮,它查找任务ID,获取连接的PBI,并将邮件项添加为附件

很简单:

public void mnuAttachToPBI_Clicked(Office.IRibbonControl control)
{

    Microsoft.Office.Interop.Outlook.Selection sel = Global.CurrentApplication.ActiveExplorer().Selection;

    if (sel != null && sel.Count > 0)
    {
        string subj;
        foreach (MailItem mailItem in sel)
        {
            subj = mailItem.Subject.Substring(mailItem.Subject.IndexOf('['));
            subj = subj.Substring(0, subj.IndexOf(']'));
            subj = subj.Replace("[", String.Empty);
            subj = subj.Replace("]", string.Empty);
            int taskId;
            if (Int32.TryParse(subj, out taskId))
            {
                WorkItem wi = TfsHandler.GetPbi(taskId);
                if (wi != null)
                {
                    string fileName = Path.GetInvalidFileNameChars().Aggregate(mailItem.Subject + ".msg", (current, c) => current.Replace(c.ToString(), "_"));
                    string path = Path.Combine(Path.GetTempPath(), fileName);

                    mailItem.SaveAs(path, OlSaveAsType.olMSG);
                    wi.Attachments.Add(new Microsoft.TeamFoundation.WorkItemTracking.Client.Attachment(path));
                    wi.Save();
                    wi.Close();
                    File.Delete(path);
                }
            }
        }
    }
}
静态TFS处理程序类如下所示:

private static List<WorkItem> _allWorkItems;

private const string ITEM_TYPE_NAME_PBI = "PBI";
private const string ITEM_TYPE_NAME_TASK = "Task";

private static List<WorkItem> AllWorkItems
{
    get
    {
        if (_allWorkItems == null)
        {
            WorkItemCollection wc = new WorkItemStore(TFS_SRV).Query(
                    " SELECT [System.Id], [System.WorkItemType]," +
                " [System.State], [System.AssignedTo], [System.Title] " +
                " FROM WorkItems");

            _allWorkItems = new List<WorkItem>();
            foreach (WorkItem w in wc)
                _allWorkItems.Add(w);
        }

        return _allWorkItems;
    }
}

/// <summary>
/// Gets the PBI, if the workitem is a task id, it checks parents
/// </summary>
/// <param name="workItemId"></param>
/// <returns></returns>
public static WorkItem GetPbi(int workItemId)
{
    WorkItem result = AllWorkItems.FirstOrDefault(f => f.Id == workItemId);

    if (result.Type.Name == ITEM_TYPE_NAME_TASK)
    {
        result = AllWorkItems.FirstOrDefault(f => f.Id == result.WorkItemLinks[0].TargetId);
    }

    return result;
}   
私有静态列表\u所有工作项;
私有常量字符串项\u类型\u名称\u PBI=“PBI”;
private const string ITEM\u TYPE\u NAME\u TASK=“TASK”;
私有静态列表所有工作项
{
得到
{
如果(_allWorkItems==null)
{
WorkItemCollection wc=新的WorkItemStore(TFS\u SRV).Query(
“选择[System.Id],[System.WorkItemType],”+
“[System.State],[System.AssignedTo],[System.Title]”+
“来自工作项目”);
_allWorkItems=新列表();
foreach(工作项w在wc中)
_所有工作项。添加(w);
}
返回所有工作项;
}
}
/// 
///获取PBI,如果workitem是任务id,它将检查父项
/// 
/// 
/// 
公共静态工作项GetPbi(int-workItemId)
{
WorkItem result=AllWorkItems.FirstOrDefault(f=>f.Id==workItemId);
if(result.Type.Name==项目类型名称任务)
{
result=AllWorkItems.FirstOrDefault(f=>f.Id==result.WorkItemLinks[0].TargetId);
}
返回结果;
}   
工作正常:我检查,如果邮件标题中有[ID],则获取任务,如果是任务,则获取PBI,将邮件另存为附件并添加它

但如果我尝试从outlook打开PBI,我会得到:


团队基础错误 跨线程操作无效:从创建控件“”的线程以外的线程访问该控件“”。 好啊 因为我正在关闭并保存工作项,也就是PBI,我真的希望它能处理这样的事情

我没有找到解决这个问题的好办法,因为我是一个初学者,我自己也不知道该怎么解决这个问题


我的站点有错误吗?或者我的方法根本不可能吗?

您将不得不做一些线程工作。当您单击Outlook中的按钮时,Outlook将生成一个新线程,该线程将尝试访问位于单独threas(您第一次调用该属性时创建的threas)上的已兑现工作项

您可能需要创建自己的后台线程上下文来拥有数据。然后单击按钮时,您可以将上下文封送到同一线程上下文以执行并传递回数据


这是一种痛苦,但这是Outlook开发…

为什么不直接使用Team Companion?它没有内置此功能吗?嗯,谢谢,我创建了自己的TFS Facades集,它允许我在WiLINQ等中抽象整个混乱。但我将尝试使用Team Companion。Teamlook+Outlook+VS TFS组合=痛苦,但它工作正常。但是我认为你的方法可以解决这个问题。